lunes, 16 de noviembre de 2015

6 - Tutorial de Laravel 5 - Validator y FormRequest (Validar formularios)




Bienvenid@s a nuevo capítulo del Tutorial de Laravel 5 en el cual veremos la base para poder validar formularios.

Es interesante que una vez realizado el ejercicio reviséis las siguiente páginas:

http://laravel.com/docs/5.1/validation : Muestra diferentes conceptos de uso para la validación, así como los diferentes argumentos de validación que podemos utilizar.

http://laravel.com/api/5.1/Illuminate/Validation/Validator.html : Clase Validator encargado de validar los atributos.

http://laravel.com/api/5.1/Illuminate/Foundation/Http/FormRequest.html : Clase FormRequest para la configuración de validación de los atributos a través de una serie de métodos y propiedades predefinidas para su posterior uso en la clase Validator.

El ejemplo del capítulo consiste en la creación de una vista miformulario.blade.php que contiene un simple formulario que contiene un campo de texto el cual será validado al enviar este formulario vía post.

El código que interviene en este capítulo lo podéis ver a continuación.

Crear la acción miFormulario en el controlador HomeController:


    public function miFormulario(){
        return View("home.miformulario");
    }


Enlazar la acción miFormulario a una ruta en routes.php

Route::get("home/miformulario", "HomeController@miFormulario");


Crear la vista miformulario.blade.php

@extends('layouts.home')
@section('title', 'Mi formulario')
@section('description', 'Validar Mi formulario')
@section('keywords', 'validar, mi, formulario')

@section('content')

<h1>Mi Formulario</h1>

<form method="post" action="{{url('home/validarmiformulario')}}">
    <div class="form-group">
        <label for="nombre">Nombre: </label>
        <input type="text" name="nombre" class="form-control" value="{{Input::old('nombre')}}" />
        <div class="text-danger">{{$errors->formulario->first('nombre')}}</div>
    </div>
    {{csrf_field()}}
    <button type="submit" class="btn btn-primary">Enviar</button>
</form>

@stop


Crear una clase para la validación en la siguiente ruta app\Http\Requests, guardar el archivo como MiFormulario.php

<?php

namespace App\Http\Requests;
use App\Http\Requests\Request;

class MiFormulario extends Request{
    
    protected $redirect = "home/miformulario";
    
    public function rules(){
        return [
            'nombre' => 'required|min:3|max:12|regex:/^[a-z]+$/i',
        ];
    }
    
    public function messages(){
        return [
            'nombre.required' => 'El campo nombre es requerido',
            'nombre.min' => 'El mínimo permitido son 3 caracteres',
            'nombre.max' => 'El máximo permitido son 12 caracteres',
            'nombre.regex' => 'Sólo se aceptan letras',
        ];
    }
    
    public function response(array $errors){
        return redirect($this->redirect)
                ->withErrors($errors, 'formulario')
                ->withInput();
    }
    
    public function authorize(){
        return true;
    }
    
}



Importar las clases Validator y MiFormulario al controlador HomeController

use App\Http\Requests\MiFormulario;
use Validator;


Crear una acción llamada validarMiFormulario en el controlador HomeController que manejará y validará la petición post del formulario ...

    public function validarMiFormulario(MiFormulario $formulario){
        $validator = Validator::make(
                $formulario->all(), 
                $formulario->rules(),
                $formulario->messages()
                );
        if ($validator->valid()){
            return "OK";
        }
    }


Enlazar la acción anterior a una ruta en routes.php

Route::post("home/validarmiformulario", "HomeController@validarMiFormulario");