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