En esta página:
- Partes
- Symfony Mailer
- Flysystem 3.x
- Eloquent Accessors/Mutators Mejorados
- Enum Eloquent Attribute Casting
- Enlaces de Route Bindings con Enumeraciones
- Scoping Forzado de Enlace de Ruta
- Grupos de Ruta en Controlador
- Índices de Texto Completo / Claúsulas Where
- Motor de Base de Datos Laravel Scout
- Representación en Línea de Blade Templates
- Atajo (Shortcut) de Slot Name
- Nota (s)
Laravel 9 fue lanzado el día 08 de Febrero de 2022 y es una versión que trae muchas novedades importantes, como un nuevo diseño de routes:list, soporte para PHP 8, controlador para grupos de rutas, Laravel Breeze API y Next.js, Nueva Query Builder Interface, Flysystem 3.x, mejoras en Eloquent Accessors / Mutator, Vistas opcionales con Bootstrap 5, etc. Todas estas novedades y otras más te las compartiré a continuación, asi que vamos con este Post.
Partes
- Parte 1
- Parte 2 (Final)
Antes de continuar, te invito a leer los siguientes artículos:
- Como Crear un CRUD con Laravel 8 y Bootstrap 5 – Parte 1
- Como Usar Mongo DB en Laravel 8 + Listado de Datos – Parte 1
- Que es Laravel + Tu Primera Aplicación con Laravel
- Las Novedades más destacadas que trae Laravel 8
- 6 Helpers de gran Utilidad en Laravel 7
- Como crear un CRUD con Galería de Imágenes en Laravel 6.2 y Bootstrap 4 – Parte 1
- Como Trabajar con Query Scopes (Ámbitos de Consulta) en Laravel 7
- Lee más artículos en la categoría Laravel
Asimismo te invito a escuchar el Podcast: “Como Hacer De La Programación Un Estilo De Vida”:
Spotify: | Sound Cloud: | Apple Podcasts |
Bien ahora continuemos con el Post: Las Novedades más destacadas que trae Laravel 9 – Parte 1.
Es importante mencionar que para correr Laravel 9, es necesario que tu servidor cuente con PHP 8. Para conocer mejor las novedades de Laravel 9, voy a colocar el nombre de la novedad, una descripción y una imagen o contenido de referencia, para tener una mejor idea acerca de la novedad.
Symfony Mailer
En versiones anteriores de Laravel, este usaba la librería Swift Mailer para enviar correos electrónicos, sin embargo esta librería ya no recibe mantenimiento por sus colaboradores, por ende el equipo de Laravel ha decidido usar Symfony Mailer en su lugar.
Puedes mirar la guía de actualización en este enlace y verificar si tu proyecto es compatible con Symfony Mailer.
Flysystem 3.x
En Laravel 9 se ha actualizado la dependencia de Flysystem upstream a Flysystem 3.x, este impulsa todas las interacciones del sistema de archivos que ofrece la Facade Storage.
Puedes leer más sobre la actualización a Flysystem 3.x en este enlace.
Eloquent Accessors/Mutators Mejorados
Laravel 9 trae una nueva forma de definir los accesores y mutadores de Eloquent. En versiones anteriores de Laravel, la única manera de definir accesores y mutadores era definiendo métodos prefijados en su modelo de la siguiente manera:
1 2 3 4 5 6 7 8 9 10 11 |
public function getNameAttribute($value) { return strtoupper($value); } public function setNameAttribute($value) { $this->attributes['name'] = $value; } |
Y en Laravel 9 se puede definir un accesor y un mutador utilizando un método único sin prefijo indicando un tipo de retorno de Illuminate\Database\Eloquent\Casts\Attribute:
1 2 3 4 5 6 7 8 9 10 11 |
use Illuminate\Database\Eloquent\Casts\Attribute; public function name(): Attribute { return new Attribute( get: fn ($value) => strtoupper($value), set: fn ($value) => $value, ); } |
Este nuevo enfoque para definir accesores almacenará en caché los valores de objeto que devuelve el atributo, al igual que las clases de convención personalizadas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
use App\Support\Address; use Illuminate\Database\Eloquent\Casts\Attribute; public function address(): Attribute { return new Attribute( get: fn ($value, $attributes) => new Address( $attributes['address_line_one'], $attributes['address_line_two'], ), set: fn (Address $value) => [ 'address_line_one' => $value->lineOne, 'address_line_two' => $value->lineTwo, ], ); } |
Enum Eloquent Attribute Casting
Ahora Eloquent te permite convertir sus valores de atributos en enumeraciones respaldadas de PHP. Para lograr esto, puedes especificar el atributo y la enumeración que deseas convertir en las propiedades del array $casts en tu modelo:
1 2 3 4 5 6 7 8 9 10 11 12 |
use App\Enums\ServerStatus; /** * The attributes that should be cast. * * @var array */ protected $casts = [ 'status' => ServerStatus::class, ]; |
Después que hayas definido la conversión en tu modelo, el atributo especificado se convertirá automáticamente hacia y desde una enumeración cuando interactúe con el atributo:
1 2 3 4 5 6 7 |
if ($server->status == ServerStatus::provisioned) { $server->status = ServerStatus::ready; $server->save(); } |
Enlaces de Route Bindings con Enumeraciones
En la versión de PHP 8.1 se introdujo soporte para Enums y Laravel 9 presenta la capacidad de escribir sugerencias de Enum en la definición de una ruta y Laravel solo invocará la ruta si ese segmento de ruta es un valor de Enum válido en el URI. De lo contrario, se devolverá automáticamente una respuesta HTTP 404. Por ejemplo, dado el siguiente Enum:
1 2 3 4 5 6 7 |
enum Category: string { case Fruits = 'fruits'; case People = 'people'; } |
Puedes definir una ruta que solo se invoque si el segmento {category} de la ruta es fruits o people. De lo contrario, se devolverá una respuesta HTTP 404:
1 2 3 4 5 |
Route::get('/categories/{category}', function (Category $category) { return $category->value; }); |
Scoping Forzado de Enlace de Ruta
En versiones ateriores de Laravel, era posible que desees incluir el segundo modelo de Eloquent en una definición de ruta de modo que debe ser un elemento secundario del modelo Eloquent anterior. Por ejemplo, considera la siguiente definición de ruta que recupera una publicación de blog por su slug para un usuario específico:
1 2 3 4 5 6 7 8 |
use App\Models\Post; use App\Models\User; Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) { return $post; }); |
Si se usa un enlace implícito con clave personalizada como parámetro de ruta anidada, Laravel automáticamente analizará la consulta para recuperar el modelo anidado por su padre usando convenciones para adivinar el nombre de la relación en el padre. Sin embargo, este comportamiento solo fue admitido anteriormente por Laravel cuando se usaba una clave personalizada para en enlace de la ruta secundaria.
Ahora el Laravel 9, puedes indicarle a Laravel que alcance los enlaces secundarios, incluso cuando no se proporciona una clave personalizada. Para hacer esto, puedes invocar el método scopeBindings() al definir tu ruta:
1 2 3 4 5 6 7 8 |
use App\Models\Post; use App\Models\User; Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) { return $post; })->scopeBindings(); |
O bien, puedes instruir a un grupo completo de definiciones de ruta para usar enlaces de ámbito:
1 2 3 4 5 6 7 |
Route::scopeBindings()->group(function () { Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) { return $post; }); }); |
Grupos de Ruta en Controlador
En Laravel 9 puedes usa el método controller() para definir el controlador común para todas las rutas dentro del grupo. Luego, al definir las rutas, solo necesitas proporcionar el método de controlador que invocan esas rutas:
1 2 3 4 5 6 7 8 |
use App\Http\Controllers\OrderController; Route::controller(OrderController::class)->group(function () { Route::get('/orders/{id}', 'show'); Route::post('/orders', 'store'); }); |
Índices de Texto Completo / Claúsulas Where
Si usas la base de datos MySQL o PostgreSQL, el método fullText() ahora se puede agregar a las definiciones de columna para generar índices de texto completo:
1 2 3 |
$table->text('bio')->fullText(); |
Asimismo, los métodos whereFullText() y orWhereFullText() se puede usar para agregar cláusulas “where” de texto completo a una consulta de columnas que tienen índices de texto completo. Laravel 9 trasnformará estos métodos en el SQL apropiado para el sistema de base de datos subyacente. Por ejemplo, MATCH AGAINST generará una claúsula para aplicaciones que utilicen MySQL:
1 2 3 4 5 |
$users = DB::table('users') ->whereFullText('bio', 'web developer') ->get(); |
Motor de Base de Datos Laravel Scout
Si tu proyecto trabaja con bases de datos de tamaño pequeño a mediano o tiene un carga de trabajo ligera, ahora puedes usar el motor de base de datos de Scout en lugar de un servicio de búsqueda dedicado como Algolia o MeiliSearch.
El motor de la base de datos utilizará cláusulas “where like” e índices de texto completo al filtrar los resultados de tu base de datos existente para determinar los resultados de búsqueda aplicable a tu consulta.
Representación en Línea de Blade Templates
En ocasiones, es posible que necesites transformar una cadena de plantilla Blade sin formato en HTML válido. Puedes hacer esto utilizando el método render() proporcionado por la facade Blade. El método render() acepta la cadena de plantilla Blade y un array opcional de datos para proporcionar a la plantilla:
1 2 3 4 5 |
use Illuminate\Support\Facades\Blade; return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']); |
Igualmente, el método renderComponent() se puede usar para representar un componente de clase dado al pasar la instancia del componente al método:
1 2 3 4 5 |
use App\View\Components\HelloComponent; return Blade::renderComponent(new HelloComponent('Julian Bashir')); |
Atajo (Shortcut) de Slot Name
En versiones anteriores de Laravel, los nombres de las ranuras se proporcionaban mediante un atributo name en la etiqueta x-slot:
1 2 3 4 5 6 7 8 9 |
<x-alert> <x-slot name="title"> Server Error </x-slot> <strong>Whoops!</strong> Something went wrong! </x-alert> |
Ahora en Laravel 9, puedes especificar el nombre de la ranura (slot) usando la sintaxis conveniente y más corta:
1 2 3 4 5 |
<x-slot:title> Server Error </x-slot> |
Bueno, hasta aqui llegamos con esta primera lista de novedades más destacadas que trae Laravel 9.
Ten Paciencia, lo que quiero es que conozcas bien estas novedades y no llenarte el capitulo de mucho contenido porque te puedes marear y no tendrás un óptimo aprendizaje.
Nota (s)
- En la siguiente parte y última, veremos la última lista de novedades de Laravel 9.
- No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.
Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.