這裡要介紹的是Lravel 在驗證進來的資料時,Laravel 的Controller使用了 ValidatesRequests
trait,它可以幫助我們很快速的分開驗證的邏輯。
Laravel 提供的example在比較下面才有提到Form Request的檢查,而且是分片段介紹的,這邊把它整理起來介紹。
通常會有一隻Request檔案專門處理,這樣可以在進入Controller之前就驗證。
1.可以選擇下指令或手動建立Requestphp artisan make:request ProductUpdateRequest
他會產生檔案在app\Http\Requests裡面,會有預設的兩個method authorize,rules
2.範例: ProductUpdateRequest.php
如果不下指令的話,也可以自己建立Request資料夾放置需要的Requests們),其中rules裡面會使用到laravel的驗證規則,更多驗證規則請查閱可用的驗證規則。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
class ProductUpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
//如果授權在其他地方驗證,這邊就都先回傳true
return true;
}
/**
* Get the validation rules that apply to the request.
** @return array
*/
public function rules()
{
return [
'id' => 'required',
'name' => 'required||max:100',
];
}
/**
* Get the error messages for the defined validation rules.
*
* @return array
*/
public function messages()
{
$messages = [
//attribute會帶入上方rules裡面有用到require規則的屬性(id, name)
'required' => 'The :attribute field is required.',
];
}
3.ProductController
<?php
namespace App\Http\Controllers;
use App\Services\ProductService;
use App\Http\Controllers\Controller;
use App\Http\Requests\ProductUpdateRequest; //宣告Request
class ProductController extends Controller
{
protected $productService;
//使用ProductUpdateRequest 驗證後的request,這樣進來的$request參數就不用再這邊另外檢查一次
public function update(ProductUpdateRequest $request)
{
$data = $this->productService->update(json_decode($request->getContent()));
return response()->json($data);
}
}
Request 還有配合前端實作,提供像驗證錯誤會被自動快閃至 session而不用另外宣告$errors變數,或是配合AJAX return json response,如果有興趣繼續研究的話可以參考官網。
結論: Request 是一個很好用的方法,它幫助我們抽離出資料來源的檢查,可以在一開始就作出決定要直接返回或是繼續交給後面的程序處理,是Controller的好幫手,可以幫我們先做好request data的檢查,寫出更乾淨的code。
參考連結: