formrequest - Laravel 5 ¿Cómo validar los parámetros de ruta?
route laravel blade (8)
La forma de CheckTokenServerRequest
es anular el método all()
para CheckTokenServerRequest
modo:
public function all()
{
$data = parent::all();
$data[''token''] = $this->route(''token'');
return $data;
}
EDITAR
La solución anterior funciona en Laravel <5.5 . Si quieres usarlo en Laravel 5.5 o superior , debes usar:
public function all($keys = null)
{
$data = parent::all($keys);
$data[''token''] = $this->route(''token'');
return $data;
}
en lugar.
Quiero validar los parámetros de ruta en la "solicitud de formulario" pero no sé cómo hacerlo.
A continuación se muestra el código de ejemplo, estoy tratando con:
Ruta
// controller Server
Route::group([''prefix'' => ''server''], function(){
Route::get(''checkToken/{token}'',[''as''=>''checkKey'',''uses''=> ''ServerController@checkToken'']);
});
Controlador
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'']
];
}
}
Pero cuando intento validar una url simple http://myurl/server/checkToken/222 , http://myurl/server/checkToken/222 la respuesta: no " token " parameter set
.
¿Es posible validar los parámetros en una "Solicitud de formulario" separada, o tengo que hacer todo en un controlador?
PD. Perdón por mi mal ingles.
Los validadores de solicitud de formulario se utilizan para validar los datos de formulario HTML que se envían al servidor mediante el método POST . Es mejor que no los use para validar los parámetros de ruta. los parámetros de ruta se utilizan principalmente para recuperar datos de la base de datos, por lo que para garantizar que su parámetro de ruta de token sea correcto, cambie esta línea de su código, desde
$token = Token::where(''token'', ''='', $request->token)->first();
a
$token = Token::where(''token'', ''='', $request->input(token))->firstOrFail();
firstOrFail () es una muy buena función, envía 404 a tu usuario, si el usuario inserta algún token no válido.
no se establece no " token " parameter set
porque Laravel asume que su parámetro "token" es un dato POST que, en su caso, no lo es.
Si insiste en validar su parámetro "token", con los validadores de solicitud de formulario, ralentizará su aplicación, ya que realiza dos consultas a su db, una aquí.
$token = Token::where(''token'', ''='', $request->token)->first();
y uno aquí
return [
''token'' => [''required'',''exists:Tokens,token,executed_at,null'']
];
Sugiero usar firsOrFail para validar y recuperar al mismo tiempo.
Para /App/Http/Requests/CheckTokenServerRequest
puede agregar use App/Http/Requests/CheckTokenServerRequest;
en la cima.
Si pasa el token
por url
, puede usarlo como una variable en el 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);
}
Si no desea especificar cada parámetro de ruta y simplemente poner todos los parámetros de ruta, puede anularlo así:
public function all()
{
return array_merge(parent::all(), $this->route()->parameters());
}
Solo te falta el guión bajo antes del token. Reemplazar con
_simbólico
Donde quiera que lo compruebes contra el formulario generado por laravel.
public function rules()
{
return [
''_token'' => [''required'',''exists:Tokens,token,executed_at,null'']
];
Un rasgo puede hacer que esta validación sea relativamente automática.
Rasgo
<?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;
}
}
Uso
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)
];
}
}
Reemplace la función all()
en el objeto Request para aplicar automáticamente las reglas de validación a los parámetros de 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;
}
}
Acceda a los datos normalmente desde el controlador de esta manera, después de inyectar la solicitud:
$setEmailRequest->email // request data
$setEmailRequest->id, // url data
$request->merge([''id'' => $id]);
...
$this->validate($request, $rules);
o
$request->merge([''param'' => $this->route(''param'')]);
...
$this->validate($request, $rules);