Las Novedades más destacadas que trae Laravel 7
En esta página:
- Personalizar Stubs
- Laravel Airlock
- Eloquent Casts Personalizados
- Etiquetas en Componentes Blade y otras mejoras
- Cliente HTTP (Guzzle)
- Operaciones fluidas con String
- Mejoras en Route Model Binding
- Múltiples Drivers (Controladores) de Correo
- Mejoras en la velocidad de caché de Ruta
- Soporte CORS
- Método withCasts
- Mejoras de MySQL 8 + Database Queue
- Comando ‘php artisan test’
- Mejoras en la Plantilla Markdown Mail
- Configuración de Queue maxExceptions
- Nota(s)
La versión de Laravel 7 ha sido lanzada el día 03 de marzo de 2020 y en esta versión se continúan muchas mejoras que se iniciaron en la versión de Laravel 6, entre estas novedades y mejoras están las mejoras de enrutamiento, Eloquent Casts personalizados, etiquetas de componentes Blade, entre otras características que te contaré en este Post.
Antes de continuar con este Post te invito a escuchar el Podcast: “Donde buscar ayuda sobre Programación”:
Spotify:
Sound Cloud:
Bien ahora continuemos con el Post: Las Novedades más destacadas que trae Laravel 7.
Para tener una mejor idea de las novedades en Laravel 7, voy a compartir el nombre de la novedad, una descripción y una imagen si es posible.
Personalizar Stubs
En Laravel, los comandos make en la consola Artisan nos permiten crear controladres, jobs, migraciones, modelos, etc. Estas clases generan archivos stubs que se rellenan con valores basados en su input.
En ocasiones, puede que necesites hacer pequeños cambios en los archivos generados por Artisan. Laravel 7 ha añadido un comando para publicar los stubs:
1 2 3 |
php artisan stub:publish |
Los stubs publicados se guardan dentro de un directorio stubs en la raíz del proyecto y cualquier cambio que se hagan en estos archivos, se verán reflejados cuando se generen las clases correspondientes utilizando el comando artisan make.
Laravel Airlock
Esta herramienta proporciona un sistema de autenticación para Aplicaciones de una sola página o Simple Page Application (SPA), aplicaciones móviles y APIs simples que trabajen con autenticación mediante tokens. Laravel Airlock fue creado por Taylor Otwell (Creador de Laravel) y permite que cada usuario genere sus propios tokens de seguridad en su cuenta, a estos tokens se le puede otorgar habilidades o ámbitos que especifiquen que acciones puedan realizar.
Si quieres saber mas sobre la autenticación por tokens en Laravel, te recomiendo leer el artículo Laravel 5.4: Guardar información de un usuario en un Token mediante JWT y si deseas saber más sobre Laravel Airlock puedes leer su documentación oficial.
Eloquent Casts Personalizados
Laravel cuenta con muchas características y utilidades Eloquent que permiten manipular o convertir los datos de una Base de Datos, en ocasiones puede que necesitemos definir nuestros propios tipos de manipuladores o convertirores de datos, ahora podemos crearlos definiendo una clase que llame a la interface CastsAttributes
Las interface CastsAttributes debe contar con 2 métodos, uno llamado get el cual es el responsable de transformar un valor sin procesar de la base de datos a una valor en estado de conversión y el otro método es set el cual transforma un valor en estado de conversión a un valor sin procesar el cual puede ser almacenado en la Base de Datos.
Por ejemplo si necesitamos implementar el tipo de conversión personalizado a formato JSON:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<?php namespace App\Casts; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; class Json implements CastsAttributes { /** * Cast the given value. * * @param \Illuminate\Database\Eloquent\Model $model * @param string $key * @param mixed $value * @param array $attributes * @return array */ public function get($model, $key, $value, $attributes) { return json_decode($value, true); } /** * Prepare the given value for storage. * * @param \Illuminate\Database\Eloquent\Model $model * @param string $key * @param array $value * @param array $attributes * @return string */ public function set($model, $key, $value, $attributes) { return json_encode($value); } } |
Si deseamos podemos llamar el nombre de la clase como un valor dentro de un atributo, por ejemplo dentro del atributo options:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App; use App\Casts\Json; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'options' => Json::class, ]; } |
Si deseas aprender más sobre el uso de Eloquent Casts Personalizados, puedes consultar su documentación oficial.
Etiquetas en Componentes Blade y otras mejoras
En Laravel 7 un componente ahora puede tener una clase asociada que especifica los datos que debe aceptar el componente. Las propiedades y métodos públicos definidos en la clase asociada a un componente estarán automáticamente disponibles en la vista del componente.
Cualquier atributo HTML adicional que sea especificado en el componente, se puede administrar utilizando la variable $attribute que permite instanciar varios atributos adicionales al componente.
Por ejemplo, supongamos que hemos definido un componente llamado Alerta:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?php namespace App\View\Components; use Illuminate\View\Component; class Alerta extends Component { /** * The alert type. * * @var string */ public $type; /** * Create the component instance. * * @param string $type * @return void */ public function __construct($type) { $this->type = $type; } /** * Get the class for the given alert type. * * @return string */ public function classForType() { return $this->type == 'danger' ? 'alert-danger' : 'alert-warning'; } /** * Get the view / contents that represent the component. * * @return \Illuminate\View\View|string */ public function render() { return view('componentes.alerta'); } } |
Y supongamos que la plantilla Blade del componente se ha definido así:
1 2 3 4 5 6 7 8 9 |
<!-- /resources/views/componentes/alerta.blade.php --> <div class="alerta {{ $classForType() }}" {{ $attributes }}> {{ $heading }} {{ $slot }} </div> |
El componente se puede renderizar en otra vista Blade, utilizando la etiqueta del componente (alerta):
1 2 3 4 5 6 7 8 9 |
<x-alerta type="error" class="mb-4"> <x-slot name="heading"> Contenido del componente Alerta ... </x-slot> Contenido por defecto ... </x-alerta> |
Esto es solo una pizca de esta nueva característica, ya que también podemos trabajar con componentes anónimos, componentes de vista en línea y varias características, puedes aprender más en su documentación oficial.
Cliente HTTP (Guzzle)
Laravel 7 ha incorporado una API basada en el cliente Guzzle PHP HTTP que permite realizar de manera ágil solicitudes HTTP, por ejemplo de manera ágil y simple podemos hacer una solicitud POST e interactuar con los datos JSON:
1 2 3 4 5 6 7 8 9 10 11 12 |
use Illuminate\Support\Facades\Http; $response = Http::withHeaders([ 'X-First' => 'foo', 'X-Second' => 'bar' ])->post('https://nubecolectiva.com/postres', [ 'nombre' => 'Torta de Chocolate', ]); return $response['id']; |
Asimismo el cliente HTTP nos proporciona una genial funcionalidad para hacer pruebas de manera dinámica:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Http::fake([ // Podemos gestionar una respuesta JSON con GitHub ... 'github.com/*' => Http::response(['foo' => 'bar'], 200, ['Headers']), // Podemos gestionar una respuesta de tipo String con Google ... 'google.com/*' => Http::response('Hola Nube Colectiva', 200, ['Headers']), // Podemos gestionar una serie de respuestas con Facebook ... 'facebook.com/*' => Http::sequence() ->push('Nube Colectiva', 200) ->push(['foo' => 'bar'], 200) ->pushStatus(404), ]); |
Si desea saber más sobre esta nueva funcionalidad, puedes consulta su documentación oficial.
Operaciones fluidas con String
Si estas familiarizado con la clase existente en Laravel que permite manipular Strings, ahora en Laravel 7 se ha añadido una biblioteca de manipulación de Strings que esta más orientada a objetos y es más fluida. Puedes crear un objeto más fluido Illuminate\Support\Stringable usando el método Str::of al cual luego le puedes encadenar una variedad de métodos que te permiten manipular el String:
1 2 3 4 5 6 |
return (string) Str::of(' Laravel Framework 6.x ') ->trim() ->replace('6.x', '7.x') ->slug(); |
Para saber más sobre las operaciones fluidas con Strings, puedes leer su documentación oficial.
Mejoras en Route Model Binding
En Laravel 7 se han añadido un par de mejoras de esta característica:
Personalizar Key
En ocasiones puede que necesites trabajar con modelos Eloquent utilizando otra columna que no sea id y ahora puedes personalizar la columna que desees definiendolo en el parámetro de una ruta, por ejemplo podemos usar el slug de un registro de la Base de Datos:
1 2 3 4 5 |
Route::get('api/postres/{postre:slug}', function (App\Postres $postre) { return $postre; }); |
Scoping Automático
En algunas ocasiones, cuando se vinculan implícitamente varios modelos Eloquent en una sola definición de ruta, es posible que necesites abarcar el segundo modelo Eloquent de modo que sea un elemento secundario del primer modelo Eloquent.
Por ejemplo, considera el siguiente ejemplo, en donde se recupera la publicación de un Blog haciendo usa de la columna slug, para un usuario específico:
1 2 3 4 5 6 7 8 |
use App\Post; use App\User; Route::get('api/usuarios/{usuario}/posts/{post:slug}', function (User $usuario, Post $post) { return $post; }); |
Cuando se utiliza un enlace implícito, con una key personalizada como parámetro de una ruta anidada, Laravel 7 analiza automáticamente la consulta para recuperar el modelo anidado por su padre, utilizando convenciones para adivinar el nombre de la relación en el padre. En este caso, se supone que el modelo User tiene una relación con la llamada posts (el plural del nombre del parámetro de ruta), que se puede utilizar para recuperar el modelo Post.
Si quieres saber más sobre esta característica, puedes leer su documentación oficial.
Múltiples Drivers (Controladores) de Correo
Laravel 7 permite configurar múltiples remitentes en una aplicación, cada aplicación configurada en el archivo mail.php puede tener sus propias opciones y su propios servicios de correo para enviar mensajes de correo electrónico.
Por ejemplo una aplicación podría usar Postmark para enviar correo transaccional mientras se usa Amazon SES para enviar correo masivo.
Por defecto Laravel usará la configuración establecida en archivo mail.php, sin embargo podemos utilizar el método mailer para enviar un mensaje utilizando una configuración de correo específica:
1 2 3 4 5 |
Mail::mailer('postmark') ->to($request->user()) ->send(new OrderShipped($order)); |
Mejoras en la velocidad de caché de Ruta
En aplicaciones grandes que cuenten por ejemplo con mas de 700 rutas o más, la velocidad es 2 veces mayor al hacer solicitudes de las rutas, no se requieren hacer cambios en las solicitudes, solo debes usar el comando php artisan route:cache y Laravel 7 llevará acabo mejoras en la velocidad de las rutas almacenadas en caché.
Soporte CORS
Laravel 7 ha añadido soporte para CORS mediante la integración del popular paquete Laravel CORS creado por Barry vd Heuvel. El soporte permite configurar OPTIONS en las solicitudes de uso compartido de recursos de origen cruzado (CORS).
Método withCasts
En algunas ocasiones puede que necesites convertir algunas consultas, por ejemplo si seleccionamos un valor sin formato de una tabla como el valor ultima_publicacion:
1 2 3 4 5 6 7 8 9 10 |
use App\Post; use App\User; $users = User::select([ 'usuarios.*', 'last_posted_at' => Post::selectRaw('MAX(created_at)') ->whereColumn('usuario_id', 'usuarios.id') ])->get(); |
Puedes ver que el atributo last_posted_at de la consulta será un String sin formato. Es conveniente si pudieramos aplicar una conversión date a este atributo al ejecutar la consulta. Esto lo podemos hacer con el método whitCasts en Laravel 7:
1 2 3 4 5 6 7 8 9 |
$users = User::select([ 'usuarios.*', 'last_posted_at' => Post::selectRaw('MAX(created_at)') ->whereColumn('usuario_id', 'usuarios.id') ])->withCasts([ 'last_posted_at' => 'date' ])->get(); |
Mejoras de MySQL 8 + Database Queue
En versiones anteriores de Laravel, la database Queue se consideraba lo suficientemente robusta para el uso en producción, debido a determinados puntos. Ahora Laravel 7 proporciona mejoras en las aplicaciones que usan MySQL 8 como la Database Queue respaldada.
Al usar la clausula FOR UPDATE SKIP LOCKED y otras mejoras de SQL, el driver database ahora se puede usar de forma segura en aplicaciones de mayor volumen.
Comando ‘php artisan test’
En Laravel 7, además del comando phpunit, ahora podemos hacer uso del comando php artisan test para realizar pruebas. Este proporciona una hermosa consola UX con información sobre la prueba que se esta llevando acabo actualmente.
Asimismo la prueba se detendrá automáticamente en el primer fallo que encuentre en la prueba que se esta llevando acabo.
Cualquier argumento que se pueda usar en el comando phpunit, también se puede usar en el comando php artisan test:
1 2 3 |
php artisan test --group=feature |
Mejoras en la Plantilla Markdown Mail
La plantilla de correo predeterminada Markdown ha recibido un nuevo diseño más moderno basado en la paleta de colores del Framework Tailwind CSS. Esta plantilla porsupuesto la puedes personalizar según tus necesidades.
Si necesitas saber más, puedes leer su documentación oficial.
Configuración de Queue maxExceptions
Algunas veces puede que desees indicar que una tarea se debe intentar muchas veces, pero debería fallar si los intentos se activan por un determinado número de excepciones. En Laravel 7 podemos definir la propiedad maxExceptions, por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?php namespace App\Jobs; class ProcessPodcast implements ShouldQueue { /** * The number of times the job may be attempted. * * @var int */ public $tries = 25; /** * The maximum number of exceptions to allow before failing. * * @var int */ public $maxExceptions = 3; /** * Execute the job. * * @return void */ public function handle() { Redis::throttle('key')->allow(10)->every(60)->then(function () { // Lock obtained, process the podcast... }, function () { // Unable to obtain lock... return $this->release(10); }); } } |
Eso es todo, hasta la fecha de este artículo, estas son las Novedades que trae Laravel 7, con el paso de las Meses iremos viendo nuevas novedades sobre este Framework.
Nota(s)
- Algunas Novedades pueden cambiar, modificarse o ser eliminadas en un futuro, esto no depende de nosotros, si no de los Desarrolladores que dan soporte a Laravel, que suelen cambiar las funcionalidades de Laravel en futuras versiones.
- 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.
- Laravel
- 03-03-2020
- 04-03-2020
- Crear un Post - Eventos Devs - Foro
Social
Redes Sociales (Developers)
Redes Sociales (Digital)