Como crear validaciones de solicitudes en Laravel 6

¿Como funciona?

La validación de datos es una cuestión importante y necesaria, afortunadamente Laravel nos provee algunas funcionalidades que nos facilitan el poder evaluarlas. Un de los métodos mas sencillos es haciendo uso del método validate() o la clase Validator. Pero también nos provee una funcionalidad conocida como form request la cual nos permite crear validaciones personalizadas y avanzadas sin hacer un desastre en tu código fuente.

Esta guía ha sido desarrollada en Laravel 6 pero debería funcionar con la versión 5.x sin problemas.


Escenario.


Necesitamos enviar un formulario con información por medio del método POST (También podría ser POST,GET,UPDATE, DELETE, etc.) y que aplique una serie de validaciones, como por ejemplo: que el email tenga un formato correcto, que un campo especifico no exceda de un numero de caracteres permitidos, etc.


Manos a la obra.


Primero definiremos nuestro formulario en la vista Resources/Views/formulario.blade.php.

formulario.blade.php

 

    <form action="{{route('clients.store')}}" method="post">
                        @csrf  
                        <div class="form-group">
                            <label for="code">Codigo</label>
                            <input type="text" class="form-control" id="code" name="code">
                        </div>
                        <div class="form-group">
                            <label for="name">Nombre</label>
                            <input type="text" class="form-control" id="name" name="name">
                        </div>
                        <div class="form-group">
                            <label for="email">Correo</label>
                            <input type="text" class="form-control" id="email" name="email">
                        </div>
                        <input type="submit" value="Validar información" class="btn btn-success">
                    </form>

Agregamos nuestra ruta al archivo Routes/web.php

web.php
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

#Nuestra ruta para el controlador que se encargará de validar la infromación
Route::post('/','ClientsController@index')->name('clients.store');


Route::get('/', function () {
    return view('form');
});


Crearemos un controlador al cual le llamaremos ClientsController, se encargará de procesar los datos y hacer la validación.

php artisan make:controller ClientsController

Usando método validate()


Una de las formas mas sencillas, como ya he mencionado es utilizar el método validate() que Laravel nos proporciona.

   $validatedData = $request->validate([
        'atributo' => 'regla1|regla2|regla3',   
    ]);

Utilizando el método validate(), nuestro controlador con los atributos correctos quedaría de la siguiente forma:

ValidatorController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ClientsController extends Controller
{
    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'code' => 'required|max:25|min:12',
            'name' => 'required|max:25|min:2',
            'email' => 'required|email',
        ]);

        // En caso de que se haya pasado la validación.
        return "Validación correcta";
    }
}

Nota: Puedes encontrar las reglas de validación en la documentación oficial de Laravel.


Mostrando mensajes de validación.

Una manera de mostrar los errores de validación es imprimiendo una lista donde el usuario puede visualizar todos los errores en caso de existan. El código siguiente se debe incluir en la vista form.blade

     @if ($errors->any())
         <div class="alert alert-danger">
              <ul>
                 @foreach ($errors->all() as $error)
                           <li>{{ $error }}</li>
                 @endforeach
              </ul>
         </div>
     @endif

También podemos mostrar un error de forma independiente.

<div class="form-group">
         <label for="email">Correo</label>
         <input type="text" class="form-control" id="email" name="email">
       @if ($errors->has('email'))
            {{ $errors->first('email') }}
       @endif
</div>

 


Validando con el uso de form requests


Además de el método validate(), Laravel nos otorga la facilidad de utlizar form requests, el cual nos sirve para realizar validaciones más complejas y personalizadas lo cual nos ayuda a crear un código mas limpio y ordenado.

Para comenzar crearemos un request llamado ClientRequest.

php artisan make:request ClientRequest

Nota: Los requests se encuentran en la ruta App/Http/Requests

En la función authorize() debemos cambiar (para este caso) el valor de retorno a true.

    public function authorize()
    {
        return true;
    }

Dentro de la función rules() se definirán todas las reglas de validación. En este caso se harán las mismas validaciones que se hicieron con el método validate().

    public function rules()
    {
        return 
            [
                'code' => 'required|max:25|min:12',
                'name' => 'required|max:25|min:2',
                'email' => 'required|email',
            ];
    }

Validación personalizada 

Por ejemplo si queremos que el e-mail sea único en una tabla especifica en nuestra base de datos, podemos hacer una validación manual y además podemos personalizar el mensaje de error; como se muestra a continuación.

 public function rules()
    {
        return
            [
            'code' => 'required|max:25|min:12',
            'name' => 'required|max:25|min:2',
            'email' => ['required', 'email', 'max:50',
                #Ejemplo de validaciones avanzadas
                function ($attribute, $value, $fail) {
                    if (is_string($value) && !empty($value)) {
                        #Busqueda en nuestro modelo Client
                        $user = Client::where('email', '=', $value)->first();
                    }
                    if (!empty($user)) {
                        #Mensaje personalizado
                        $fail(__('El email ya existe'));
                    }
                }],
        ];
    }

Las funciones de validación pueden ser complejas, tanto como tu lo necesites.

Mensajes personalizados para errores

Para personalizar los mensajes de validación, solo debes incluir la función message() dentro de tu request (ClientRequest):

    public function messages()
    {
        return [
            'code.required' => 'El codigo debe ser un campo requerido',
            'email.email' => 'El correo debe tener un formato correcto',
        ];
    }

Puedes agregar los mensajes que prefieras de acuerdo a las reglas que Laravel nos propociona.


Preparando controlador para validación.

Ahora debemos modificar nuestro controlador, para esta forma de validar. El controlador deberá contener un objeto request de tipo ClientRequest, por lo tanto no debemos olvidar importar la clase ClientRequest e indicar que la solicitud que recibiremos en la función store() será de tipo ClientRequest

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests\ClientRequest; #importar request
class ClientsController extends Controller
{
    #En lugar de Request $request usar ClientRequest $request
    public function store(ClientRequest $request)
    {
        return "Validación correcta";
    }
}

Si la existen errores, mostrará los mensajes personalizados del request ClientRequest, en caso contrario mostrará un mensaje indicando que la validación ha sido correcta. 

Este ha sido un ejemplo sencillo, se pueden implementar muchas más funcionalidades, todo depende de tus necesidades.

Pero debemos recordar que tenemos a nuestra disposición la documentación oficial de laravel.

Gracias por leer este pequeño ejemplo. Si tienes alguna pregunta o sugerencia, no dudes en dejarla en los comentarios, me gustaría saber tu opinión.


SOBRE EL AUTOR
Javi Zamora
Javi Zamora

Hola soy Javier creador de Visión Código con la intención de ayudar a los nuevos jovenes programadores con pequeños tutoriales que te salvan la vida.