Novedades de Laravel 5.5

Esta es la lección 8 del Curso de novedades de Laravel 5.5. Es común que la creación y actualización de registros requiera de validación de datos que vienen del usuario, bien sea de un formulario o de una API. Laravel 5.5 ahora viene cargado de mejoras relacionadas a la validación de peticiones o requests que permitirán simplificar el código de tus controladores y/o rutas.

Suscríbete a nuestro boletín

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

Notas

Por Clemir Rondón.

En versiones anteriores de Laravel los típicos pasos para validar una petición o request y guardar el modelo correspondiente pueden ser los siguientes (no es la única forma de hacerlo):

public function update()
{
    $this->validate(request(), [
        'bio' => 'required',
        'twitter' => 'alpha_num',
        'github' => 'alpha_num'
    ]);

    $data = request()->all();

    $profile = auth()->user()->profile;

    $profile->fill($data);

    $profile->save();
}

En las relaciones uno a uno como User tiene un UserProfile puede suceder que si queremos encontrar el perfil de un usuario y éste no tiene uno, la aplicación lanzará un error.  Para resolver este inconveniente podemos usar el método withDefault que nos permite agregar un modelo UserProfile por defecto. Para detalles del método mira la lección: Nuevo método withDefault para las relaciones uno a uno de Eloquent en Laravel 5.3.

El objeto request que contiene los datos se puede obtener de tres formas: con el helper request(), con la Facade Illuminate\Support\Facades\Request o a través de la inyección de dependencias. La decisión de usar una y otra forma es personal y solo importa que seas consistente en la aplicación.  Para conocer un poco más sobre la diferencia entre estas 3 maneras de trabajar puedes mirar: Facades vs helpers vs inyección de dependencias y helper de caché en Laravel 5.3.

El método validate del controlador es proporcionado por el trait Illuminate\Foundation\Validation\ValidatesRequests que es incluido en el controlador App\Http\Controllers\Controller del que extiende por defecto todos los demás controladores.

Para probar el método update creamos una prueba que nos permita enviar una petición a la aplicación con los datos de perfil de un usuario y esperamos obtener 2 cosas: que la petición haya sido aceptada y que en la tabla profiles se encuentren los datos enviados asociados al usuario conectado.  En esta prueba usamos el método assertDatabaseHas para verificar la existencia de un registro en una tabla de la base de datos con las condiciones dadas. El método complementario es assertDatabaseMissing que verifica que un registro con las condiciones dadas no se encuentra en la base de datos.

Si has escrito pruebas que interactuan con la base de datos o has visto los métodos seeInDatabasedontSeeInDatabase, estos pertenecen al componente de pruebas de Laravel 5.3 y son equivalentes a los usados en este video que pertenecen al componente de pruebas de Laravel 5.4 y 5.5.

No olvides agregar a la prueba el trait RefreshDatabase cómo aprendiste en la lección Flujo de desarrollo con PHPUnit y base de datos en Laravel 5.5 (RefreshDatabase)

El error de asignación masiva ocurre para proteger a la aplicación que un usuario malintencionado o no quiera hacer cambios en la base de datos que no son los esperados y se soluciona agregando en el modelo la propiedad $fillable indicando en un array los campos que únicamente se quieren guardar de forma masiva.

Ahora para Laravel 5.5 el objeto request contiene el método validate con el cual se simplifica el proceso de validación pues en vez de hacer en el controlador $this->validate(request(), $reglas); trabajaríamos directamente con el método del objeto request de esta manera request()->validate($reglas);

Esto nos da flexibilidad puesto que podemos validar una petición en una ruta al ya no depender depender del método del controlador.  Si no quieres usar este método también tienes disponible el facade Validator para crear manualmente la instancia del validador.

Por otro lado, al estar el método validate dentro del objeto request entonces podemos validar la petición independientemente de la forma como obtenemos el objeto: por helper, facade o inyección de dependencias.

Si quieres aprender sobre la inyección de independencias y las otras características de la programación orientada a objetos te invitamos a unirte a la comunidad y podrás aprender de estos temas con nuestro Curso de programación orientada a objetos con PHP.

Otra ventaja es que este método devuelve los datos validados para poder usarlos en las siguientes acciones del controlador, sin embargo, debes estar pendiente que si un campo no tienes reglas de validación debes incluirlo en el array de reglas para que sea tomado en cuenta.

public function update()
{
    $data = request()->validate([
        'bio' => 'required',
        'twitter' => 'alpha_num',
        'github' => 'alpha_num'
        'campo_sin_reglas' => ''
    ]);

    $profile = auth()->user()->profile;

    $profile->fill($data);

    $profile->save();
}

También puedes usar los form request para validar los datos y para obtener los datos validados con el método validated de la siguiente manera:

public function update(UpdateProfileRequest $request)
{
    $profile = auth()->user()->profile;

    $profile->fill($request->validated());

    $profile->save();
}

Quedando un poco más limpio nuestro código en el controlador. Para conocer en detalle sobre Form Request mira nuestro tutorial: Cómo trabajar con Form Requests en Laravel

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.

Lección anterior Flujo de desarrollo con PHPUnit y base de datos en Laravel 5.5 (RefreshDatabase) Lección siguiente Manejo de excepciones en las pruebas en Laravel 5.5