Search code examples
phplaravelrouteslaravel-validationlaravel-request

Laravel 5 how to validate route parameters?


I want to validate the route parameters in the "form request" but don't know how to do it.

Below is the code sample, I am trying with:

Route

// controller Server
Route::group(['prefix' => 'server'], function(){
    Route::get('checkToken/{token}',['as'=>'checkKey','uses'=> 'ServerController@checkToken']);
});

Controller

namespace App\Http\Controllers;


use App\Http\Controllers\Controller;

use Illuminate\Http\Request;
use App\Http\Requests;


class ServerController extends Controller {
    public function checkToken( \App\Http\Requests\CheckTokenServerRequest $request) // OT: - why I have to set full path to work??
        {   
            $token = Token::where('token', '=', $request->token)->first();      
            $dt = new DateTime; 
            $token->executed_at = $dt->format('m-d-y H:i:s');
            $token->save();

            return response()->json(json_decode($token->json),200);
        }
}

CheckTokenServerRequest

namespace App\Http\Requests;

use App\Http\Requests\Request;

class CheckTokenServerRequest extends Request {

        //autorization

        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {

            return [
                'token' => ['required','exists:Tokens,token,executed_at,null']
            ];
        }

}

But when I try to validate a simple url http://myurl/server/checkToken/222, I am getting the response: no " token " parameter set.

Is it possible to validate the parameters in a separate "Form request", Or I have to do all in a controller?

ps. Sorry for my bad English.


Solution

  • For Laravel < 5.5:
    The way for this is overriding all() method for CheckTokenServerRequest like so:

    public function all() 
    {
       $data = parent::all();
       $data['token'] = $this->route('token');
       return $data;
    }
    

    EDIT
    For Laravel >= 5.5:
    Above solution works in Laravel < 5.5. If you want to use it in Laravel 5.5 or above, you should use:

    public function all($keys = null) 
    {
       $data = parent::all($keys);
       $data['token'] = $this->route('token');
       return $data;
    }
    

    instead.