Las 10 mejores adiciones al Framework Laravel en el 2021
Tags: php, laravel
Published: 2022-01-18 01:43:03

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:

```php
// 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');
```







## 9 Reglas de validación condicional

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

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







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

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

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







## 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()`:

```php
Route::post('/user/{user}', function (ImplicitBindingModel $user) {
    return $user;
})->middleware(['web'])->withTrashed();
```







## 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
<?php
 
$request->validate([
    'password' => [
        'required',
        'confirmed',
        Password::min(8)
            ->mixedCase()
            ->letters()
            ->numbers()
            ->symbols()
            ->uncompromised(),
    ],
]);
```







## 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`:

```php
// app/Providers/AppServiceProvider.php
 
public function boot()
{
    Model::preventLazyLoading(! app()->isProduction());
}
```

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

```php
// 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);
}
```







## 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":

```php
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());
    }
}
```

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()`:

```php
Route::get('/posts/{post}/comments/{comment}', function (Post $post, Comment $comment) {
    return $comment;
})->scopeBindings();
```







## 1 Busqueda de texto completo en Mysql & Postgres

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

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







## 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:

```php
$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
```






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.