🎃 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 12 a Laravel 13
07/08 La actualización a Laravel 13 Rector con el set de Laravel 13: PreventRequestForgery y propiedades a atributos
Tu lectura Quedan 20 min
Lección 7 de 8 · La actualización a Laravel 13

Rector con el set de Laravel 13: PreventRequestForgery y propiedades a atributos

20 min de lectura Laravel 13

Hola, bienvenido. En esta lección vamos a pasar Rector con el set de Laravel 13 de rector-laravel. En este proyecto propone 2 tipos de cambio: renombrar la referencia a ValidateCsrfToken de config/sanctum.php a PreventRequestForgery, y pasar las propiedades de los modelos y del comando tickets:close-stale a atributos de PHP, como #[Fillable] o #[Signature].

El primero es el que dejamos pendiente en la lección 5. El segundo es opcional, porque cambia el estilo del código y no su comportamiento, así que vamos a ver qué propone antes de decidir.

Lo que propone Rector con Laravel 13 instalado

rector.php no cambia: el set basado en Composer ya incluye las reglas de Laravel 13, y cada una comprueba la versión de laravel/framework instalada antes de actuar. Las de atributos, por ejemplo, solo se activan desde Laravel 13, porque los atributos no existen en versiones anteriores, y por eso el --dry-run de la lección 3 no propuso nada. Vamos a ver qué propone ahora, sin aplicar nada:

Terminal
sail bin rector --dry-run
Salida
6 files with changes ==================== 1) config/sanctum.php:80 ---------- begin diff ---------- @@ Line 80 @@ 'middleware' => [ 'authenticate_session' => AuthenticateSession::class, 'encrypt_cookies' => EncryptCookies::class, - 'validate_csrf_token' => ValidateCsrfToken::class, + 'validate_csrf_token' => \Illuminate\Foundation\Http\Middleware\PreventRequestForgery::class, ], ]; ----------- end diff ----------- Applied rules: * RenameClassRector 2) app/Console/Commands/CloseStaleTickets.php:6 ---------- begin diff ---------- @@ Line 6 @@ use App\Models\Ticket; use Illuminate\Console\Command; +#[\Illuminate\Console\Attributes\Description('Cierra los tickets que llevan días esperando una respuesta del cliente')] +#[\Illuminate\Console\Attributes\Signature('tickets:close-stale {--days=7 : Días sin respuesta del cliente}')] class CloseStaleTickets extends Command { - protected $signature = 'tickets:close-stale {--days=7 : Días sin respuesta del cliente}'; - - protected $description = 'Cierra los tickets que llevan días esperando una respuesta del cliente'; - public function handle(): int { $stale = Ticket::query() ----------- end diff ----------- Applied rules: * DescriptionPropertyToDescriptionAttributeRector * SignaturePropertyToSignatureAttributeRector ... 4) app/Models/Ticket.php:14 ---------- begin diff ---------- @@ Line 14 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; +#[\Illuminate\Database\Eloquent\Attributes\Appends([ + 'hours_left', +])] +#[\Illuminate\Database\Eloquent\Attributes\Fillable([ + 'subject', + 'body', + 'status', + 'priority', + 'estimated_hours', + 'due_at', +])] class Ticket extends Model { use HasFactory, HasUuids; - - protected $fillable = [ - 'subject', - 'body', - 'status', - 'priority', - 'estimated_hours', - 'due_at', - ]; - - protected $appends = [ - 'hours_left', - ]; /** * @return BelongsTo<User, $this> ----------- end diff ----------- Applied rules: * AppendsPropertyToAppendsAttributeRector * FillablePropertyToFillableAttributeRector ... 6) app/Models/User.php:10 ---------- begin diff ---------- @@ Line 10 @@ use Laravel\Sanctum\HasApiTokens; use Spatie\Permission\Traits\HasRoles; +#[\Illuminate\Database\Eloquent\Attributes\Fillable([ + 'name', + 'email', + 'password', +])] +#[\Illuminate\Database\Eloquent\Attributes\Hidden([ + 'password', + 'remember_token', +])] class User extends Authenticatable implements MustVerifyEmail { use HasApiTokens, HasFactory, HasRoles, Notifiable; - - /** - * The attributes that are mass assignable. - * - * @var list<string> - */ - protected $fillable = [ - 'name', - 'email', - 'password', - ]; - - /** - * The attributes that should be hidden for serialization. - * - * @var list<string> - */ - protected $hidden = [ - 'password', - 'remember_token', - ]; /** * @return HasMany<Ticket, $this> ----------- end diff ----------- Applied rules: * FillablePropertyToFillableAttributeRector * HiddenPropertyToHiddenAttributeRector [OK] 6 files would have been changed (dry-run) by Rector

6 archivos, y nos hemos saltado 2 en la salida, Attachment y TicketReply, que solo cambian $fillable, igual que Ticket. Las reglas que se aplican son de 2 tipos, y conviene separarlos, porque no tienen el mismo peso:

Renombrado del middleware Propiedades a atributos
Qué hace Cambia las referencias a VerifyCsrfToken y ValidateCsrfToken por PreventRequestForgery Cambia $fillable, $hidden, $appends, $signature y $description por #[Fillable], #[Hidden], #[Appends], #[Signature] y #[Description]
En el proyecto config/sanctum.php Los 4 modelos y el comando tickets:close-stale
Por qué Los nombres anteriores son alias obsoletos Es la forma que usa la documentación de Laravel 13
¿Cambia el comportamiento? No, el alias hereda de la clase nueva No, Laravel 13 sigue leyendo las propiedades
¿Se puede dejar fuera? Se puede, pero algún día el alias desaparecerá Sí, es una decisión de estilo

En rector-laravel, los 2 tipos son 2 partes del set de Laravel 13: la primera es un renombrado de clases y la segunda reúne todas las reglas de atributos de modelos, comandos, jobs, form requests y API resources. En este proyecto solo encuentran modelos y un comando.

Lo que queda de esta lección
  1. 02PreventRequestForgery en config/sanctum.php
  2. 03Las propiedades de los modelos y del comando, a atributos
  3. 04Aplicar, Pint y composer qa en verde
Sigue leyendo con tu suscripción El curso completo, con el certificado y el foro, está incluido en la suscripción. Ver los planes