En este post, vamos a validar los datos recibidos desde el cliente, para ello:
- Crear clase que intercepte la petición y la valide con unas determinadas reglas adaptadas a nuestras necesidades.
- Usar la clase validadora en los métodos del controlador de notas.
- Modificar la respuesta desde el servidor al cliente cuando se produce una excepcion de validación.
Para la validación de datos que llegan al servidor por POST y PUT, hay 2 formas:
- Validación dentro de un controlador, en los métodos que lo requieran (store y update en los de tipo resource).
- Validación por FormRequest, mediante una clase que intercepta la petición, la valida y si pasa, accedemos al código del controlador.
Usaremos en este caso los FormRequest, para ello creamos la clase con el comando:
1 |
php artisan make:request NoteRequest |
Abrimos el archivo y editamos tal que:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
use Illuminate\Foundation\Http\FormRequest; class NoteRequest extends FormRequest { public function authorize() { return true; } public function rules() { $rules = [ 'title' => 'required|min:3|max:255', 'content' => 'max:1000', ]; if (!empty($this->image) && $this->image != "null") { switch (gettype($this->image)) { case 'string': $rules['image'] = 'url'; return $rules; break; case 'object': $rules['image'] = 'image|max:10000'; // 10Kb return $rules; break; } } else { return $rules; } } } |
Usamos el FormRequest personalizado en los métodos del controlador de notas:
1 2 3 4 5 6 7 8 9 10 |
use App\Http\Requests\NoteRequest; use Illuminate\Http\Request; class NoteController extends Controller { public function store(NoteRequest $request){ . . . . } public function update(NoteRequest $request){ . . . . } } |
Por último, debido a que los errores de validación arrojan/lanzan excepciones de validación, capturaremos esa excepción y devolveremos una respuesta personalizada usando el ResponseMacro que hemos creado en este post, tal que:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
. . . . use Illuminate\Validation\ValidationException; class Handler extends ExceptionHandler { . . . . public function render($request, Exception $exception) { if ($exception instanceof ValidationException && $this->isAPIGuard()) { return response()->error($exception->validator->errors(), 422); } if (strpos($exception->getMessage(), 'token') !== false) { return response()->json(['error' => $exception->getMessage()], $exception->getCode()); } return parent::render($request, $exception); } . . . . protected function isAPIGuard() { return class_basename(\Auth::guard()) != "SessionGuard"; } } |