Nuevo método safe validation en Laravel

Spread the love

Cuando validamos datos mediante el uso de un Form request o por medio del Request es posible recuperar los datos validados de forma muy sencilla.

veamos como ejemplo el siguiente Form Request

<?php

namespace App\Http\Requests;

class PostRequest extends FormRequest
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'status'=>'required|string',
            'title' => 'required|unique:posts',
            'content' => 'required',
        ];
    }
}

Si quieres recuperar los datos validados lo puedes hacer usando el método validated()

//array of validated inputs
$validated = $request->validated()

Este método devuelve un array de los datos que fueron validados.

Pero..

¿Qué pasa si quieres recuperar sólo una parte de los datos validados? ¿Cómo lo harías?

El problema es que no podemos recuperar solo una parte de los datos o agregar mas elementos a este arreglo.

Pero podemos obtener un elemento o agregar mas elementos a ese arreglo transformando el arreglo de datos validados a una colección.

//Add more data
$merged = collect($request->validated())
    ->merge(['user_id' => aut()->id()]);

//get a single input
$value = collect($request->validated())
    ->get('title');

De esta forma podemos realizar lo que necesitamos, pero no es una solución muy elegante..

Así que para este tipo de casos se agrego al Form Request el método safe() que nos permite obtener una parte de los elementos validados.

Veamos como lo hace.

Obteniendo una parte de los datos validados

Por ejemplo, con el método safe() podemos obtener algunos elementos de los datos validados:

//Arreglo solo con los campos title y content
$validated = $request->safe()->only(['title', 'content']);

También es posible obtener un solo elemento:

// Arreglo que contiene solo a title
$validated = $request->safe(['title']);

Puedes excluir algunos resultados:

//Arreglo que solo contiene a status
$validated = $request->safe()
    ->except(['title', 'content']);

Puedes agregar nuevos elementos al arreglo de datos validados

//Agrega usser_id al arreglo
$validated = $request->safe()
    ->merge(['user_id' => auth()->id()]);

Finalmente podemos obtener todos los resultados validados de la siguiente forma:

//Obtienes un arreglo con todos los campos validados
$validated = $request->safe()->all();

Para finalizar, si necesitas hacer operaciones adicionales puedes obtener los campos validados como una colección.

$validated = $request
    ->safe()
    ->collect()
    ->map(function($item){
        //..
    })
    ->all();