banner Validación de Checkbox con Form Requests en Laravel

Los Form Requests en Laravel, son clases que permiten validar formularios muy fácilmente, utilizando una serie de reglas para verificar si los campos enviados por el usuario cumplen con los criterios requeridos por la aplicación. Hoy hablaremos de como validar arrays y checkboxes usando un FormRequest.

Creando un nuevo Form Request

Para generar un Form Request, ejecuta desde la consola el siguiente comando:

$ php artisan make:request RegisterUserRequest

Esto creará una nueva clase llama RegisterUserRequest dentro del directorio app\Http\Requests donde podremos agregar las reglas de validación necesarias:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class RegisterUserRequest extends FormRequest
{

    public function authorize()
    {
        return true;
    }


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

Para no obtener un error de autorización, cambia el método authorize para que retorne true en vez de false.

Trabajando con checkboxes

Digamos que queremos almacenar en nuestra base de datos un campo «skills» que será un campo de texto con valores separados por comas. El formulario tendrá una lista de checkboxes que le permitirá al usuario seleccionar una o más opciones:

<form method="POST" action="/form-post">
    {{ csrf_field() }}
    <input type="checkbox" name="skills" value="php">PHP</br>
    <input type="checkbox" name="skills" value="mysql">MySQL</br>
    <input type="checkbox" name="skills" value="javascript">JavaScript</br>
    <input type="checkbox" name="skills" value="laravel">Laravel</br>
    <input type="submit">
</form>

Para ver el resultado, agregaremos lo siguiente en el archivo de rutas de la aplicación:

use App\Http\Requests\RegisterUserRequest;

Route::post('form-post', function (RegisterUserRequest $request) {
    dd(request()->all());
});

Debido a que en el formulario anterior llamamos igual a todos los checkboxes, al enviar el formulario veremos únicamente el valor de un solo checkbox seleccionado por el usuario:

array:2 [
  "_token" => "0LEsLpX3zdCgiHcLhImi5g7446qdgb98EDbtdq61"
  "skills" => "laravel"
]

Pero en este caso queremos enviar todos los que el usuario ha seleccionado, para ello simplemente cambiamos el nombre del campo skills a skills[], esto permitirá capturar la data de todos estos campos dentro de un array. De tal manera, que si seleccionamos todos las opciones y enviamos el formulario, el resultado sería algo similar a esto:

array:2 [
  "_token" => "0LEsLpX3zdCgiHcLhImi5g7446qdgb98EDbtdq61"
  "skills" => array:4 [
    0 => "php"
    1 => "mysql"
    2 => "javascript"
    3 => "laravel"
  ]
]

Validación de arrays con un Form Request

Para prevenir que los usuarios cambien el código HTML desde el navegador y puedan enviar valores distintos a los esperados por la aplicación, podemos validar de la siguiente manera:

public function rules()
{
    return [
        'skills.*' => 'in:php,mysql,javascript,laravel'
    ];
}

Si agregamos un nuevo campo al formulario, por ejemplo:

<input type="checkbox" name="skills[]" value="ruby">Ruby</br>

Obtendremos un error al tratar de enviar el formulario, ya que el valor «ruby» no está dentro de los valores validos:

"skills.2" => [
    0 => "The selected skills.2 is invalid."
]

Puedes cambiar el mensaje de error editando el array «custom» dentro del archivo lang/{lang}/validation.php:

'custom' => [
    'skills.*' => [
        'in' => 'The selected skill is invalid',
    ],
],

En tal caso el resultado será algo como:

"skills.2" => [
    0 => "The selected skill is invalid."
]

Si quisieras validar uno a uno los checkboxes, puedes agregar un key al nombre de los campos en el formulario:

<input type="checkbox" name="skills[a]" value="php">PHP</br>
<input type="checkbox" name="skills[b]" value="mysql">MySql</br>
<input type="checkbox" name="skills[c]" value="javascript">Javascript</br>
<input type="checkbox" name="skills[d]" value="laravel">Laravel</br>

De esta manera puedes validar cada campo por separado:

public function rules()
{
    return [
        'skills.a' => 'in:php',
        'skills.b' => 'in:mysql'
        ....
    ];
}

Por supuesto es mucho más conveniente utilizar la validación de array de Laravel.

Convirtiendo el array en un string

Seguramente quieras almacenar estos datos en una columna de tu base de datos utilizando Eloquent, para convertir este array antes de guardar el registro puedes usar un «Mutator» desde el modelo.

Por ejemplo, si trabajas con el modelo User.php y quieres almacenar el campo skills puedes agregar el siguiente metodo a app/User.php

public function setSkillsAttribute($value)
{
     $this->attributes['skills'] = implode(', ', $value);
}

La convención para los Mutators es set{fiel_name}Attributte($value)

Este código se ejecuta justamente al momento de asignar los skills antes de guardar el registro.

Material relacionado

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

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