DEV Community

Ariel Mejia
Ariel Mejia

Posted on

Las 10 mejores adiciones al Framework Laravel en el 2021

Laravel 9 se lanzará este enero de 2021. Aquí una lista de mis adiciones favoritas al framework durante 2021.

Muchas de estas funciones ya están disponibles, afortunadamente el proceso de lanzamiento ahora es más suave y podemos disfrutar muchas de estas funciones con versiones menores.

10 Método "can" en la definición de las rutas

Un nuevo método que puede ser usando en vez de pasarle una cadena de strings como parámetro a un middleware:

// En vez de hacer esto
Route::put('/post/{post}', function (Post $post) {
    // El usuario actual actualiza el post
})->middleware('can:update,post');

// Podemos usar el método can
Route::put('/post/{post}', function (Post $post) {
    // El usuario actual actualiza el post
})->can('update', 'post');
Enter fullscreen mode Exit fullscreen mode

9 Reglas de validación condicional

Retorna un booleano, si la condición se cumple (true) aplica las reglas del segundo parámetro:

request()->validate([
    'name' => 'required|string|min:6',
    'password' => [
        'required',
        'string',
        Rule::when(true, ['min:5', 'confirmed'])
    ],
]);
Enter fullscreen mode Exit fullscreen mode

8 Ignorar "Trashed Models" en la regla de validación "Unique"

Agrega un helper que permite ignorar los modelos "trashed":

// Antes
[
    'email'=> [
        Rule::unique('users')->whereNull('deleted_at'),
    ],
];

// Despues
[
    'email'=> [
        Rule::unique('users')->ignoreTrashed(),
    ],
];
Enter fullscreen mode Exit fullscreen mode

7 Soporte a "With Trashed" en las rutas.

Anteriormente un modelo "trashed" no podía ser resuelto usando "route model binding", ahora esto es posible agregando en la definición de una ruta el método withTrashed():

Route::post('/user/{user}', function (ImplicitBindingModel $user) {
    return $user;
})->middleware(['web'])->withTrashed();
Enter fullscreen mode Exit fullscreen mode

6 Objeto de validación "Password"

Es un requisito muy común validar contraseñas con múltiples reglas como tener al menos una mayúscula, minúscula, tener un símbolo, tener un número, etc... ahora es muy fácil de implementar con Password Rule Object:

<?php

$request->validate([
    'password' => [
        'required',
        'confirmed',
        Password::min(8)
            ->mixedCase()
            ->letters()
            ->numbers()
            ->symbols()
            ->uncompromised(),
    ],
]);
Enter fullscreen mode Exit fullscreen mode

5 Deshabilitar "Lazy Loading"

Con este cambio, la aplicación retornará una excepción si hay un modelo que no devuelve relaciones de carga ambiciosa (eager loading).

Requiere registrar este cambio en el archivo AppServiceProvider.php:

// app/Providers/AppServiceProvider.php

public function boot()
{
    Model::preventLazyLoading(! app()->isProduction());
}
Enter fullscreen mode Exit fullscreen mode

Ahora deberas usar "eager loading" al intentar usar las relaciones de un modelo así: $user->with('posts'); o $user->load('posts')

4 Registro de Logs con contexto

// Ejemplo de Middleware

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    $requestId = (string) Str::uuid();

    Log::withContext([
        'request-id' => $requestId
    ]);

    return $next($request)->header('Request-Id', $requestId);
}
Enter fullscreen mode Exit fullscreen mode

3 Modelos "Prunables"

Nuno Maduro agrega una característica sorprendente al framework, la capacidad de eliminar registros obsoletos al hacer que los modelos de Laravel sean "prunables":

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable; // or MassPrunable

class Post extends Model
{
    use Prunable; // or MassPrunable

    /**
     * Determines the prunable query.
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function prunable()
    {
        return $this->where('created_at', '<=', now()->subMonth());
    }
}
Enter fullscreen mode Exit fullscreen mode

Puede elegir entre prunable o massPrunable.

La principal diferencia entre ambos es que el método prunable eliminaría un modelo y activaría eventos de modelo de eloquent y massPrunable solo eliminaría todos los modelos que coincidieran con la condición sin activar ningún evento.

2 Cumplir "Implicit Route Model Scoping"

Hay casos en los que tiene una relación de rutas anidadas y sería bueno validar que el segundo modelo es hijo del primero, ahora está disponible usando el método scopeBindings():

Route::get('/posts/{post}/comments/{comment}', function (Post $post, Comment $comment) {
    return $comment;
})->scopeBindings();
Enter fullscreen mode Exit fullscreen mode

1 Busqueda de texto completo en Mysql & Postgres

Puede buscar un término en diferentes columnas con este método:

// it search the word Laravel in title and body columns
$post = DB::table('posts')
    ->whereFullText(['title', 'body'], 'Laravel')
    ->get();
Enter fullscreen mode Exit fullscreen mode

Bonus Agregar Inputs a los datos Validados

A veces necesitamos agregar "automáticamente" un valor por defecto o como resultado de una clase de servicio, etc... ahora es realmente fácil agregar esto:

$validator = Validator::make(
    ['name' => 'Taylor'],
    ['name' => 'required']
);

$validator->safe()->merge(['role' => 'Admin']);

User::create($validator->safe()->all());
// el usuario se almacenaría con el nombre Taylor y con el rol de administrador
Enter fullscreen mode Exit fullscreen mode

Hay muchas características que merecen un lugar aquí, pero en aras de mantener esta publicación breve, mencionaré muy brevemente algunas de ellas que pueden resultarle útiles.

  • Ahora la cookie "Remember me" es configurable desde el archivo: config/app.php

  • Nuevo método de asserción AssertIfModelExists (sugar syntax for assertDatabaseHas())

  • Nuevos flags para comandos de Artisan (--test, --pest, --requests, etc)

  • Nuevos métodos "Dump" de la clase "TestResponse" (dd(), dump(), dumpHeaders(), etc)

  • Nuevos helpers para status de una respuesta HTTP ($response->forbidden(), $response->notFound(), etc ...)

  • Validar multiples formatos de fechas

  • Mejoras en Accessors y Mutators

  • Nuevo diseño para el comando routes:list

Espero que sea de utilidad y permita mayor visibilidad en todos los beneficios que tenemos disponibles recientemente en el framework Laravel.

Gracias por leer el post.

Discussion (3)

Collapse
cristianh033 profile image
Cristian David Home

Excelente post, muchas gracias.

Collapse
kennyhorna profile image
Kenny Horna

Buen artículo @arielmejiadev . Solo ten presente que ya estamos en el 2022 ;)

Collapse
arielmejiadev profile image
Ariel Mejia Author

Hola Kenny, si todos estos features fueron agregados durante el 2021, la idea es hacer un recopilatorio, saludos!