¿Qué hay de nuevo en Laravel 8?
Laravel 8 se lanzó hace ocho meses con un montón de actualizaciones útiles por las que estabamos emocionado de saber. En este artículo, repasaré los cambios. Si le interesa obtener todos los detalles, visite la nota de lanzamiento aquí.
Laravel Jetstream
La versión 8 presenta Laravel Jetstream, un andamio de aplicaciones para el marco con un elegante panel de control de usuario. Jetstream maneja todo, desde el inicio de sesión, el registro y la verificación del correo electrónico, hasta la administración de sesiones y la administración de equipos opcional. Está diseñado con un marco CSS altamente personalizable, Tailwind, y le ofrece la posibilidad de elegir entre Livewire e Inertia.
Para comenzar, ejecute lo siguiente:
composer global require laravel/installerlaravel new laravel-8 --jet
npm install && npm run devphp artisan serve
Asegúrese de agregar el nombre de su base de datos al archivo .env y migrarlo.
Al actualizar, verá la página de bienvenida habitual de Laravel (aunque se ve algo diferente y mucho más elegante). Haga clic en el enlace de registro para registrar su cuenta y navegar a /dashboard
para ver su nuevo panel:
En este punto, si ejecuta php artisan vendor:publish — tag=jetstream-views
y busca en resources/views/vendor/jetstream/components
, verá una lista de componentes disponibles para usar de inmediato. welcome.blade.php
, por ejemplo, se usaría en su aplicación como <x-jet-welcome />
.
Un directorio de modelos
He aquí, el momento que todos estábamos esperando: ¡un directorio de modelos!
Antes de la versión 8, todos los modelos nuevos y existentes se encontraban en la raíz del directorio /app
del marco. La mayoría crearía una subcarpeta de Models
, movería todos los modelos a dicha carpeta y cambiaría sus espacios de nombres para reflejar la nueva ruta. Creo que hablo en nombre de la comunidad cuando digo que no nos gustó esta configuración. Sin embargo, Otwell lo ha compensado con creces con esta última actualización. Todos los comandos del generador de modelos se han actualizado para colocar nuevos modelos dentro de una carpeta Models
. Si el directorio aún no existe, se creará uno para usted, junto con su nuevo modelo. ¡Días felices!
Clases de fábrica de modelos
Las fábricas basadas en clases han reemplazado a las fábricas modelo que conocíamos antes.
Laravel 7
/** * Run the database seeds. * * @return void */ public function run() { factory(App\User::class, 50)->create()->each(function ($user) { $user->posts()->save(factory(App\Post::class)->make()); }); }
Laravel 8
use App\Models\User;/** * Run the database seeders. * * @return void */ public function run() { User::factory() ->times(50) ->hasPosts(1) ->create(); }
Aplastamiento de la migración
Esta nueva característica genial hace que las carpetas de migración voluminosas sean cosa del pasado. Se introdujo el aplastamiento de migraciones, lo que permite que todas las migraciones se aplastien en un solo archivo SQL.
Al ejecutar lo siguiente, se creará una carpeta de schema
en la database
con un archivo SQL que contiene las consultas CREATE TABLE para todas sus migraciones:
php artisan schema:dump
Para eliminar las migraciones dejando solo el archivo SQL, ejecute lo siguiente:
php artisan schema:dump --prune
php artisan migrate
ejecutará primero el esquema SQL, seguido de cualquier nueva migración que aún no forme parte del archivo en migrations
. Para incluir nuevas migraciones en el archivo de esquema, simplemente ejecute el comando schema:dump
nuevamente.
Trabajo por lotes
La nueva función de procesamiento por lotes de trabajos de Laravel permite que se envíen varios trabajos utilizando el nuevo método por batch
de la fachada del Bus
. Por supuesto, puede usar métodos como then
, finally
y catch
para personalizar su finalización. La implementación básica está a continuación:
<?php namespace App\Jobs; use App\Jobs\ProcessFile; use App\File; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class ProcessFiles implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. * * @return void */ public function __construct() { // } /** * Execute the job. * * @return void */ public function handle() { $batch = Bus::batch([ new ProcessFile(File::find(1)), new ProcessFile(File::find(2)), new ProcessFile(File::find(3)), new ProcessFile(File::find(4)), new ProcessFile(File::find(5)), ])->then(function (Batch $batch) { // Do something when completed successfully... })->catch(function (Batch $batch, Throwable $e) { // Caught when first batch job failure detected })->finally(function (Batch $batch) { // Do something when batch has finished })->dispatch(); return $batch->id; } }
Limitación de velocidad mejorada
Establecer un límite de tasa de aciertos en las rutas ahora se puede hacer de una manera más flexible y encapsulada que en la versión anterior. Usando el método for
de la fachada RateLimiter
, se pueden establecer tiempos límite e incluso pueden ser dinámicos en función de la solicitud $request
.
Laravel 7
Route::middleware('auth:api', 'throttle:60,1')->group(function () { Route::get('/user', function () { // }); });
Laravel 8
use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Support\Facades\RateLimiter;RateLimiter::for('global', function (Request $request) { return $request->user()->vipCustomer() ? Limit::none() : Limit::perMinute(100); });
Para hacer uso de estos límites en ciertas rutas, aplíquelos como lo haría con cualquier middleware usando el mismo nombre que pasó al método for
:
Route::middleware(['throttle:global'])->group(function () { Route::post('/audio', function () { // });Route::post('/video', function () { // }); });
Sin embargo, se ha mantenido la compatibilidad con versiones anteriores para hacer uso de la API de middleware de throttle
de la versión anterior.
Modo de mantenimiento mejorado
A pesar de tener nuestra aplicación en modo de mantenimiento, Laravel permite que usuarios específicos la vean, siempre que cumplan con una determinada condición. Esta condición ahora ha cambiado: anteriormente se requería una dirección IP, ahora es un token secreto.
Laravel 7
php artisan down --allow=127.0.0.1 --allow=192.168.0.0/16
Laravel 8
php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"
Después de configurar el token, Laravel sabrá buscarlo cuando un usuario acceda a la URL. Entonces, lo siguiente mostrará la aplicación:
https://test-site.com/1630542a-246b-4b66-afa1-dd72a4c43515
Una vez que la cookie se haya guardado en su navegador, podrá volver a visitar la aplicación tal como lo haría fuera del modo de mantenimiento.
Representación previa de una vista en modo de mantenimiento
Como parte de las mejoras del modo de mantenimiento, ahora puede renderizar previamente una vista de mantenimiento específica.
¿Por qué es esto tan importante?
Bueno, antes de esto, si ejecutaba php artisan down
durante la implementación, aún existía la posibilidad de que los usuarios pudieran encontrar un error si llegaban a la aplicación antes de que las dependencias se actualizaran para reflejar el nuevo modo. Con esta adición, se puede especificar una vista de modo de mantenimiento de su elección y se mostrará inmediatamente al inicio del ciclo de solicitud, por lo que no hay que esperar a que se inicie el marco.
php artisan down --render="errors::503"
Despacho / Cadena de Cierre
Se ha agregado un nuevo método de catch
que se ejecutará si un cierre en cola no se completa con éxito. Esto es muy útil para personalizar lo que sucede en caso de esa falla.
Laravel 7
$podcast = App\Podcast::find(1);dispatch(function () use ($podcast) { $podcast->publish(); });
Laravel 8
$podcast = App\Podcast::find(1);dispatch(function () use ($podcast) { $podcast->publish(); })->catch(function (Throwable $e) { // This job has failed... });
Componentes dinámicos de la hoja
Ahora ya no es necesario codificar los nombres de los componentes en una página, sino que se pueden representar en función de un valor de tiempo de ejecución o una variable.
Laravel 7
php artisan make:component Info
Para mostrar el componente, debe usar el siguiente comando:
Laravel 8
<x-dynamic-component :component="$componentName" />
Veamos cómo podemos implementar esto.
Primero, cree un componente usando php artisan make:component <component-name>
. Decidí llamar al mío success
:
<div> <x-jet-section-title title="Congrats!" description="Your first dynamic component!" /> </div>
Luego, elija una ruta y transmita los datos relevantes a la vista a través de su controlador:
<?php namespace Laravel\Jetstream\Http\Controllers\Livewire; use Illuminate\Http\Request; use Illuminate\Routing\Controller; class UserProfileController extends Controller { /** * Show the user profile screen. * * @param \Illuminate\Http\Request $request * @return \Illuminate\View\View */ public function show(Request $request) { return view('profile.show', [ 'request' => $request, 'user' => $request->user(), 'message' => 'success' ]); } }
<x-app-layout> <x-slot name="header"> <h2 class="font-semibold text-xl text-gray-800 leading-tight"> {{ __('Profile') }} </h2> <x-dynamic-component :component="$message" /> </x-slot> </x-app-layout>
Elegí renderizar mi componente dinámico en show.blade.php
. Navegar a /user/profile
desde su panel ahora debería mostrar su texto de éxito:
Esto es extremadamente útil para cargar dinámicamente componentes de éxito o error. Simplemente pase el nombre a la vista (en este ejemplo, la variable fue mensaje y el valor fue éxito), y siempre que haya un componente con ese nombre, Laravel lo renderizará dinámicamente.
Mejoras en el oyente de eventos
Los oyentes de eventos se han mejorado para incluir el registro de oyentes de eventos basados en Closure
. Esto se puede hacer solo pasando el Closure
al método Event::listen
. Además, estos nuevos oyentes de eventos basados en Closure
también se pueden marcar como queueable
y, al igual que los trabajos en cola, los métodos habituales existentes (onConnection
, onQueue
y delay
) se pueden usar para personalizar la ejecución del oyente en cola.
Event::listen(queueable(function (PodcastProcessed $event) { // }));
Marcar como queueable
es, por supuesto, opcional y se puede eliminar.
Ayudantes de prueba de tiempo
Esta nueva actualización nos trae ayudantes que permiten la modificación de las marcas de tiempo devueltas durante las pruebas. La introducción de travel()
se puede usar junto con el famoso now()
para ir al futuro, viajar en el tiempo y regresar al presente.
// Travel into the past $this->travel(-5)->hours();// Come back to the present $this->travelBack();
Recarga automática en cambios de entorno
Cualquier cambio detectado en el archivo .env
ahora activará una recarga automática, eliminando la necesidad de detener y reiniciar manualmente el comando de serve
.
Tailwind se convierte en el estilo predeterminado para el paginador
¡Pero las vistas de Bootstrap 3 y 4 seguirán estando disponibles!
Actualizaciones del espacio de nombres de enrutamiento
La clase RouteServiceProvider
en las versiones 7 y siguientes contenía una propiedad de $namespace
. Luego, el valor de esta propiedad fue prefijado a todas las rutas establecidas en los archivos de rutas. Esta nueva versión de Laravel elimina el espacio de nombres y, en su lugar, los nombres de las clases se utilizan directamente en los archivos de rutas.
Laravel 7
class RouteServiceProvider extends ServiceProvider{/*** This namespace is applied to your controller routes.* In addition, it is set as the URL generator's root namespace.** @var string*/protected $namespace = 'App\Http\Controllers';}
Por lo tanto, hacer lo siguiente funcionaría y el marco sabría exactamente dónde se sentó su controlador:
Route::get('/users', 'UserController@index');
Laravel 8
Presentamos una nueva forma de trazar rutas:
use App\Http\Controllers\UserController;Route::get('/users', [UserController::class, 'index']);
Esas son todas las características nuevas y actualizadas anunciadas en la versión de Laravel 8. ¡Espero que hayas disfrutado leyendo sobre ellos! ¿Tienes algún favorito?
¡Feliz codificación!