Laravel 5 Как проверить параметры маршрута?

Я хочу проверить параметры маршрута в" запросе формы", но не знаю, как это сделать.

Ниже приведен пример кода, я пытаюсь с:

маршрут

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

контроллер

namespace AppHttpControllers;


use AppHttpControllersController;

use IlluminateHttpRequest;
use AppHttpRequests;


class ServerController extends Controller {

public function checkToken( AppHttpRequestsCheckTokenServerRequest $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 AppHttpRequests;

use AppHttpRequestsRequest;

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']
        ];
    }

}

но когда я пытаюсь проверить простой url http://myurl/server/checkToken/222, я получаю ответ: no " token " parameter set.

можно ли проверить параметры в отдельном "запросе формы", или я должен сделать все в контроллере?

ps. Извините за мой плохой английский.

7 ответов


путь для этого переопределяет all() метод CheckTokenServerRequest вот так:

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

редактировать

выше решение работает в фреймворк Laravel . Если вы хотите использовать его в фреймворк Laravel 5.5 или выше, вы должны использовать:

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

валидаторы запроса формы используются для проверки HTML форма данных, которые отправляются на сервер через в должности метод. Лучше не использовать их для проверки параметров маршрута. параметры маршрута в основном используются для получения данных из базы данных, поэтому, чтобы убедиться, что ваш параметр маршрута токена правильный, измените эту строку кода из

$token = Token::where('token', '=', $request->token)->first();

to

$token = Token::where('token', '=', $request->input(token))->firstOrFail();

firstOrFail() очень хорошая функция, она отправляет 404 вашему пользователю, если пользователь вставляет недопустимый токен.

вы получаете no " token " parameter set потому что Laravel предполагает, что ваш параметр" токен " является данными POST, которые в вашем случае это не так.

если вы настаиваете на проверке вашего параметра "токен", от валидаторов запросов вы будете замедлять свое приложение, потому что вы выполняете два запросы к вашей БД, здесь

$token = Token::where('token', '=', $request->token)->first();

и здесь

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

Я предлагаю использовать firsOrFail сделать как проверка и извлечение сразу.


черта может привести к тому, что эта проверка будет относительно автоматической.

признак

<?php

namespace App\Http\Requests;

/**
 * Class RouteParameterValidation
 * @package App\Http\Requests
 */
trait RouteParameterValidation{

    /**
     * @var bool
     */
    private $captured_route_vars = false;

    /**
     * @return mixed
     */
    public function all(){
        return $this->capture_route_vars(parent::all());
    }

    /**
     * @param $inputs
     *
     * @return mixed
     */
    private function capture_route_vars($inputs){
        if($this->captured_route_vars){
            return $inputs;
        }

        $inputs += $this->route()->parameters();
        $inputs = self::numbers($inputs);

        $this->replace($inputs);
        $this->captured_route_vars = true;

        return $inputs;
    }

    /**
     * @param $inputs
     *
     * @return mixed
     */
    private static function numbers($inputs){
        foreach($inputs as $k => $input){
            if(is_numeric($input) and !is_infinite($inputs[$k] * 1)){
                $inputs[$k] *= 1;
            }
        }

        return $inputs;
    }

}

использование

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class MyCustomRequest extends FormRequest{
    use RouteParameterValidation;

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize(){
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules(){
        return [
            //
            'any_route_param' => 'required'//any rule(s) or custom rule(s)
        ];
    }
}

на \App\Http\Requests\CheckTokenServerRequest вы можете добавить use App\Http\Requests\CheckTokenServerRequest; в верхней части.
Если вы пройдете token by url вы можете использовать его как переменную в controller.

public function checkToken($token) //same with the name in url
{

    $_token = Token::where('token', '=', $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);
}

переопределить all() функция объекта запроса для автоматического применения правил проверки к параметрам URL

class SetEmailRequest
{

    public function rules()
    {
        return [
            'email'    => 'required|email|max:40',
            'id'       => 'required|integer', // << url parameter
        ];
    }

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

        return $data;
    }

    public function authorize()
    {
        return true;
    }
}

доступ к данным обычно от контроллера, как это, после инъекции запроса:

$setEmailRequest->email // request data
$setEmailRequest->id, // url data

Если вы не хотите указывать каждый параметр маршрута и просто помещать все параметры маршрута, вы можете переопределить следующим образом:

public function all()
{
    return array_merge(parent::all(), $this->route()->parameters());
}

вам просто не хватает подчеркивания перед токеном. Заменить на

_token

везде, где вы проверяете его против формы, сгенерированной laravel.

public function rules()
{

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