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');
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'])
],
]);
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(),
],
];
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();
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(),
],
]);
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());
}
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);
}
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());
}
}
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();
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();
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
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 forassertDatabaseHas()
)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.
Top comments (3)
Excelente post, muchas gracias.
Buen artículo @arielmejiadev . Solo ten presente que ya estamos en el 2022 ;)
Hola Kenny, si todos estos features fueron agregados durante el 2021, la idea es hacer un recopilatorio, saludos!