El validador de Laravel cuenta con una serie de reglas que cubren muchos de los posibles tipos de datos que puedan ser enviados a nuestra aplicación por medio de los formularios, pero siempre encontramos esos casos especiales dónde estas reglas no se adaptan a las necesidades específicas del proyecto, en este caso se crea la necesidad de crear algunos criterios de evaluación personalizados.

Veamos como podemos crear reglas personalizadas extendiendo la funcionalidad del validador de Laravel.

Creando un nuevo Form Request

Los Form Request son clases que se usan en Laravel para definir las reglas de validación y que gracias al contenedor de inyección de dependencias del framework, se ejecutan en el momento en el que es llamado el controlador que las implementa.

Para crear un form request usamos desde la consola:

$ php artisan make:request CreatePostRequest

Esto creará una clase CreateFormRequest dentro del directorio app\Http\Requests

<?php

namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;

class CreatePostRequest extends FormRequest
{

    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            //
        ];
    }
}

Desde un controlador podríamos usar entonces lo siguiente:

public function store(CreatePostRequest $request)
{
    // do something
}

Si alguna de las reglas definidas en el array «rules» de la clase CreateFormRequest falla, por defecto se retorna a la página anterior incluyendo en la sesión los mensajes de error del validador.

Creando una regla personalizada

Digamos que queremos verificar que un campo de texto no contenga ninguna etiqueta HTML, para ello podríamos crear una nueva regla «no_html«. Esto lo podemos hacer utilizando el método extendImplicit() de la clase Illuminate\Validation\Factory. Un buen lugar para hacerlo es el método boot() de la clase app\Providers\AppServiceProvider.

<?php

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Validation\Factory as Validator;

class AppServiceProvider extends ServiceProvider
{

    public function boot()
    {
        $this->app->validator->extendImplicit('no_html', function ($attribute, $value, $parameters) {
            return str_len($value) == str_len(strip_tags($value));
        }, 'You can\'t use html here !');
    }
    
}

El resultado de la función anónima debe ser un booleano (true o false).

El método extendImplicit recibe como parámetros: el nombre de la nueva regla que estamos creando, una función anónima (que recibe el nombre del atributo, el valor de dicho campo y los parámetros adicionales definidos en la regla de validación) y finalmente un mensaje de error. Por ejemplo si usamos en el Form Request:

public function rules()
{
    return [
        'title' => 'no_html:a,b,c'
    ];
}

En este caso la variable $parameters del bloque anterior tendrá el siguiente array de datos:

$this->app->validator->extendImplicit('no_html', function ($attribute, $value, $parameters) {
    dd($parameters);
    }, 'You can\'t use html here !');

// Imprime
array:3 [
  0 => "a"
  1 => "b"
  2 => "c"
]

De esta manera, puedes crear reglas personalizadas manteniendo una estructura muy limpia tanto en los controladores como en los FormRequests de tu aplicación.

Material relacionado

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.