La validación es crucial cuando se maneja la entrada del usuario en su aplicación Laravel para garantizar la coherencia de los datosy evitar errores. Las reglas de validación en línea en los métodos del controlador pueden volverse engorrosas y repetitivas. Para solucionar esto, Laravel proporciona clases FormRequest que le permiten definir reglas de validación de forma centralizada y reutilizable. Anteriormente, es posible que haya escrito reglas de validación directamente en su método Controlador como esta:

Prácticas No Recomendadas

Tratar de evitar a lo posible  todas las validaciones dentro del método ya que se podrían reutilizar en el método update o en llamadas de api

public function store(Request $request)
{
    $request->validate([
        'slug' => 'required',
        'title' => 'required|unique:posts|max:255',
        ...
    ]);
}

Prácticas Recomendadas

El uso de Request Classes en Laravel es una práctica recomendada para gestionar la validación de datos de manera centralizada y ordenada. A diferencia de escribir reglas de validación directamente en los métodos de los controladores, lo cual puede resultar en código engorroso y difícil de mantener, las Request Classes permiten definir reglas de forma modular y reutilizable. Esto facilita la coherencia en la aplicación y evita la duplicación de código en múltiples métodos.

Por ejemplo, al crear una clase de solicitud personalizada StoreRequest que extiende de FormRequest, puedes definir las reglas de validación de forma clara y específica:

class StoreRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'slug' => 'required',
            'title' => 'required|unique:posts|max:255',
            // otras reglas…
        ];
    }
}

Luego, en el método del controlador, solo necesitas referenciar la clase de solicitud personalizada, haciendo que el código sea más limpio y fácil de leer, asi mismo se puede reutilizar la misma logica tanto para update como para store y en llamadas a /api/

public function store(StoreRequest $request)
{
    // Lógica para almacenar los datos validados...
}

¿Cómo crear un Form Request?

Ejecutaremos este comando

php artisan make:request PostRequest

El comando creará una carpeta llamada Requests en app/Http (si no la tienes aun) y dentro de ella, nuestra clase que se verá como está:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class PostRequest extends FormRequest
{
    /**
    * Determine if the user is authorized to make this request.
    */
    public function authorize(): bool
    {
        return false;
    }

    /**
    * Get the validation rules that apply to the request.
    *
    * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
    */
    public function rules(): array
    {
        return [
            //
        ];
    }
}

Validaciones personalizadas

public function rules(): array
    {
        return [
            'title' => 'required|unique:posts|max:255',
            'content' => 'required|min:50',
            'slug' => 'required|alpha_dash|unique:posts,slug',
        ];
    }

    /**
    * Mensajes de error personalizados para la validación.
    */
    public function messages(): array
    {
        return [
            'title.required' => 'El título es obligatorio.',
            'title.unique' => 'Este título ya ha sido utilizado.',
            'content.required' => 'El contenido no puede estar vacío.',
            'content.min' => 'El contenido debe tener al menos 50 caracteres.',
            'slug.required' => 'El slug es obligatorio.',
            'slug.alpha_dash' => 'El slug solo puede contener letras, números, guiones y guiones bajos.',
            'slug.unique' => 'Este slug ya existe en el sistema.',
        ];
    }

¿Cómo funciona un Form Request?

Para usar una clase de FormRequest en el método store de tu controlador, simplemente debes pasarla como parámetro en el método. Laravel inyectará automáticamente el FormRequest en el controlador y validará la solicitud antes de ejecutar el código dentro de store.

Aquí tienes un ejemplo usando la clase PostRequest en el método store de un controlador llamado PostController:

<?php

namespace App\Http\Controllers;

use App\Http\Requests\PostRequest;
use App\Models\Post;

class PostController extends Controller
{
    /**
    * Almacenar un nuevo post en la base de datos.
    */
    public function store(PostRequest $request)
    {
        // Obtener los datos validados
        $data = $request->validated();

        // Crear el nuevo post usando los datos validados
        $post = Post::create($data);

        // Redireccionar o retornar una respuesta
        return redirect()->route('posts.index')->with('success', 'Post creado exitosamente');
    }
}

Sobrescribir propiedades para Redireccionar los Form Request

En caso que la validación no pase, podemos definir a donde queremos que se redirija la solicitud. Tenemos tres formas de definir la redirección:

  • redirect: La propiedad redirect debe ser definida con una URI.
  • redirectRoute: La propiedad redirectRoute debe ser definida con el nombre de una ruta.
  • redirectAction: La propiedad redirectAction debe ser definida con un método de un controlador.
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class PostRequest extends FormRequest
{

    // Nota utilizar sólo una
    protected $redirect = '/custom-uri';
    protected $redirectRoute = 'posts.create';
    protected $redirectAction = 'App\Http\Controllers\PostController@create';

    public function authorize(): bool
    {
        return false;
    }

    public function rules(): array
    {
        return [
          'title.required' => 'El :atribute es obligatorio',
          'title.unique' => 'El :atribute debe ser único',
          'body.require' => 'El :atribute es obligatorio',
        ];
    }}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *