09/09La actualización a Laravel 12Rector con el set de Laravel 12: el atributo #[Scope] y Request::input()
0%Tu lecturaQuedan 18 min
Lección 9 de 9· La actualización a Laravel 12
Rector con el set de Laravel 12: el atributo #[Scope] y Request::input()
18 min de lecturaLaravel 12
Hola, bienvenido. En esta lección, la última del curso, vamos a dar el paso final del plan: pasar Rector con el set de Laravel 12 de rector-laravel, que aplica los cambios mecánicos del código. En este proyecto son 2: los scopes de Ticket pasan al atributo #[Scope], y $request->get() pasa a $request->input(). El primero lo aplica el set directamente. El segundo también está en el set, pero no llega a ejecutarse, y vamos a ver por qué y cómo añadirlo a Rector con una regla propia.
Al terminar tendremos el proyecto en el mismo punto que el tag laravel-12 del repositorio, y cerraremos el curso repasando lo que hemos hecho y lo que queda para la siguiente actualización.
01
El set de Laravel 12 en rector.php
rector.php elige el set de rector-laravel a mano, con LaravelSetList::LARAVEL_110, el de los cambios de Laravel 10 a Laravel 11, que ya están aplicados. Cada constante de LaravelSetList contiene solo los cambios de una versión a la siguiente, así que vamos a cambiarla por la de Laravel 12, y la regla de genéricos de la lección 5 sigue donde está:
Podríamos dejar los 2 sets, pero el de Laravel 11 ya no tiene nada que cambiar en el proyecto, como vimos en la lección 4 con un --dry-run que no proponía nada, y con uno solo queda claro en qué versión está el código. Si alguna vez necesitas subir varias versiones a la vez, rector-laravel tiene también LaravelLevelSetList, cuyos sets incluyen las reglas de todas las versiones anteriores.
Vamos a ver qué propone el set antes de aplicar nada:
Terminal
$ sail bin rector --dry-run
Salida
1 file with changes
===================
1) app/Models/Ticket.php:61
---------- begin diff ----------
@@ Line 61 @@
: app(Sla::class)->hoursLeft($this->due_at));
}
- public function scopeOpen(Builder $query): void
+ #[\Illuminate\Database\Eloquent\Attributes\Scope]
+ protected function open(Builder $query): void
{
$query->where('status', '!=', TicketStatus::Closed);
}
- public function scopeForUser(Builder $query, User $user): void
+ #[\Illuminate\Database\Eloquent\Attributes\Scope]
+ protected function forUser(Builder $query, User $user): void
{
$query->unless(
$user->can('tickets.view-any'),
----------- end diff -----------
Applied rules:
* ScopeNamedClassMethodToScopeAttributedClassMethodRector
[OK] 1 file would have been changed (dry-run) by Rector
Un solo archivo, Ticket, con los 2 scopes. El set de Laravel 12 tiene otra regla, la que quita la clase abstracta de los bind() del contenedor que ya reciben una closure con su tipo de retorno, y no aparece porque el proyecto no registra nada así. Y falta algo que esperábamos: TicketController lee la búsqueda con $request->get('q', ''), y el set no lo ha cambiado.
Lo que queda de esta lección
02El atributo #[Scope]
03Lo que el set no hace: de Request::get() a input()
04Aplicar, Pint y composer qa en verde
05Lo que hemos hecho y lo que queda
Sigue leyendo con tu suscripciónEl curso completo, con el certificado y el foro, está incluido en la suscripción.Ver los planes¿Ya tienes cuenta? Entra
Usamos cookies propias necesarias para que la plataforma funcione y, solo con tu permiso, cookies de analítica para entender cómo se usa la web. No usamos cookies publicitarias.
Más información.
Preferencias de cookies
Elige qué cookies quieres permitir. Puedes cambiarlo cuando quieras.
NecesariasImprescindibles para iniciar sesión, recordar tu sesión y proteger los formularios. No se pueden desactivar.
Siempre activas
Google Analytics, para medir de forma agregada cómo se usa la plataforma y mejorarla.