Laravel 5 как проверить параметры маршрута?
Я хочу проверить параметры маршрута в "запросе формы", но не знаю, как это сделать.
Ниже приведен пример кода, я пытаюсь с:
маршрут
// controller Server
Route::group(['prefix' => 'server'], function(){
Route::get('checkToken/{token}',['as'=>'checkKey','uses'=> '[email protected]']);
});
контроллер
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']
];
}
}
Но когда я пытаюсь проверить простой URL-адрес http://myurl/server/checkToken/222, я получаю ответ: no " token " parameter set
.
Можно ли проверить параметры в отдельном "запросе формы", или я должен сделать все в контроллере?
пс. Извините за мой плохой английский.
Ответы
Ответ 1
Способ для этого - переопределить метод all()
для CheckTokenServerRequest
следующим образом:
public function all()
{
$data = parent::all();
$data['token'] = $this->route('token');
return $data;
}
РЕДАКТИРОВАТЬ
Вышеупомянутое решение работает в Laravel <5.5. Если вы хотите использовать его в Laravel 5.5 или выше, вы должны использовать:
public function all($keys = null)
{
$data = parent::all($keys);
$data['token'] = $this->route('token');
return $data;
}
вместо.
Ответ 2
Валидаторы запроса формы используются для проверки данных формы HTML, которые отправляются на сервер методом POST. Лучше, чтобы вы не использовали их для проверки параметров маршрута. Параметры маршрута в основном используются для извлечения данных из базы данных, поэтому, чтобы гарантировать, что ваш параметр маршрута токена является правильным, измените эту строку вашего кода, с
$token = Token::where('token', '=', $request->token)->first();
в
$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 для одновременной проверки и получения.
Ответ 3
Переопределить функцию all()
объекта Request, чтобы автоматически применять правила проверки к параметрам 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
Ответ 4
Если вы не хотите указывать каждый параметр маршрута и просто вводите все параметры маршрута, вы можете переопределить их следующим образом:
Laravel & lt; 5,5:
public function all()
{
return array_merge(parent::all(), $this->route()->parameters());
}
Laravel 5.5 или выше:
public function all($keys = null)
{
// Add route parameters to validation data
return array_merge(parent::all(), $this->route()->parameters());
}
Ответ 5
Признак может привести к тому, что эта проверка будет относительно автоматической.
Тре
<?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)
];
}
}
Ответ 6
Для \App\Http\Requests\CheckTokenServerRequest
вы можете добавить use App\Http\Requests\CheckTokenServerRequest;
вверху.
Если вы передадите token
на 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);
}
Ответ 7
Вам просто не хватает символа подчеркивания перед токеном. Замените
_token
где бы вы ни проверяли его на форму, сгенерированную laravel.
public function rules()
{
return [
'_token' => ['required','exists:Tokens,token,executed_at,null']
];
Ответ 8
$request->merge(['id' => $id]);
...
$this->validate($request, $rules);
или же
$request->merge(['param' => $this->route('param')]);
...
$this->validate($request, $rules);
Ответ 9
FormRequest имеет метод validationData()
который определяет, какие данные использовать для проверки. Так что просто переопределите это с параметрами маршрута в вашем классе запроса формы:
/**
* Use route parameters for validation
* @return array
*/
protected function validationData()
{
return $this->route()->parameters();
}
Ответ 10
или оставьте большую часть all
логики на месте и переопределите метод input
из trait \Illuminate\Http\Concerns\InteractsWithInput
/**
* Retrieve an input item from the request.
*
* @param string|null $key
* @param string|array|null $default
* @return string|array|null
*/
public function input($key = null, $default = null)
{
return data_get(
$this->getInputSource()->all() + $this->query->all() + $this->route()->parameters(), $key, $default
);
}