🎃 12 meses por 75 €

El plan anual a mitad de precio hasta el 31 de octubre.

Aprovechar la oferta

🎃 Halloween: 12 meses por 75 €

Plan anual a mitad de precio, para altas y renovaciones. Solo hasta el 31 de octubre.
Aprovechar la oferta
Saltar al contenido
Curso Actualizar un proyecto de Laravel 11 a Laravel 12
09/09 La actualización a Laravel 12 Rector con el set de Laravel 12: el atributo #[Scope] y Request::input()
Tu lectura Quedan 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 lectura Laravel 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.

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á:

rector.php Modificado +1 −1
14 __DIR__.'/tests',
15 ])
16 ->withSets([
− LaravelSetList::LARAVEL_110,
+ LaravelSetList::LARAVEL_120,
18 ])
19 ->withRules([
20 AddGenericReturnTypeToRelationsRector::class,
21 ]);

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
  1. 02El atributo #[Scope]
  2. 03Lo que el set no hace: de Request::get() a input()
  3. 04Aplicar, Pint y composer qa en verde
  4. 05Lo que hemos hecho y lo que queda
Sigue leyendo con tu suscripción El curso completo, con el certificado y el foro, está incluido en la suscripción. Ver los planes