關於RESTFUL 和 Validate 的兩三事

關於RESTFUL 和 Validate 的兩三事

本篇主要在處理當要使用RESTful API時又要對路由(route) 裡面的參數做驗證時的方法。

一般我們在使用RESTful API時,往往會帶一個參數到路由,例如:

Route::get('/product/productId', 'ProductController@show')->name('.show');

接者,如果你的productId 也需要透過Request 做驗證,可能會長得像這樣:

//ProductController

class ProductController extends Controller {
    public function show(ShowRequest $Request)
    {
        $request->only(['product_id']);
        ...
    }
}
//ShowRequestclass
ShowRequest extends Request{
    public function rules()
    {
        return [
            'product_id' => 'required|integer',
            ...
        ];
}

所以,一個RESTful API的請求,就必須傳兩次product_id。這樣感覺就不’elegant’ !!竟然要同時送兩個一樣的參數使用?

這是我目前解套的方法:

>如果有其他的參數要傳入,把其他參數放在ShowRequest裡面,另外把$product_id傳入。在ProductController內,再利用$request -> merge($array)$product_id合併到$request內,大概長這樣:

 

//ProductController

class ProductController extends Controller {

    public function show($product_id, ShowRequest $Request)
    {
        $idRequest = [
            'product_id' => $productId,
        ];
        $request->merge($idRequest);
        $input = $request->all();
        ...
    }
}
//ShowRequestclass

ShowRequest extends Request{

    public function rules()
    {
        return [
            'name' => 'required|string',
            'price' => 'required|integer',
            ...
        ];
    }

}

但是這樣$product_id就做不了驗證了,如果也想要做product_id驗證…

不要使用ShowRequest,一樣把product_id合併到$request內並直接在Controller內做驗證:

//ProductController

class ProductController extends Controller {

    public function show($product_id, Request $Request)
    {
        $idRequest = [
            'product_id' => $productId,
        ];

        $request->merge($idRequest);

        $this->validate($request, [
            'product_id' => required|integer,
            'name' => 'required|string',
            'price' => 'required|integer',
            ...
        ]);

       $input = $request->all();
        ...
    }
}

雖然說一樣長得不是很好看,但是至少API文件內就不用在傳遞兩次product_id了!