🎃 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
04/09 La actualización a Laravel 12 Actualizar Larastan 2 a Larastan 3 con PHPStan 2: por qué Rector 2 entra a la vez
Tu lectura Quedan 14 min
Lección 4 de 9 · La actualización a Laravel 12

Actualizar Larastan 2 a Larastan 3 con PHPStan 2: por qué Rector 2 entra a la vez

14 min de lectura Laravel 12

Hola, bienvenido. En esta lección vamos a actualizar Larastan 2 a Larastan 3, que funciona sobre PHPStan 2, y Rector 1.2 a Rector 2, con el proyecto todavía en Laravel 11.

Aunque en la lección 2 ya vimos por qué Rector tiene que subir con Larastan, vamos a cambiar primero solo Larastan, para ver el error tal como aparece y aprender a leerlo. Y al final de la lección veremos qué señala Larastan 3 en el código, que es lo que resolveremos en la siguiente lección.

Larastan 3 exige PHP 8.2 y PHPStan 2, y su última versión admite Laravel desde la versión 11.44.2, así que nuestro Laravel 11.57 cumple. Larastan está en require-dev con ^2.9, y vamos a pasar esa restricción a ^3.0 en composer.json, sin cambiar nada más:

composer.json Modificado +1 −1
16 "require-dev": {
17 "driftingly/rector-laravel": "^1.2",
18 "fakerphp/faker": "^1.9.1",
− "larastan/larastan": "^2.9",
+ "larastan/larastan": "^3.0",
20 "laravel/breeze": "^2.0",
21 "laravel/pint": "^1.13",
22 "laravel/sail": "^1.26",

Y vamos a resolver las dependencias, igual que en la lección anterior. Esta es la salida el 21 de octubre de 2026 (la lista de versiones de Larastan y PHPStan será más larga cuando lo lances tú):

Terminal
sail composer update -W
Salida
Loading composer repositories with package information Updating dependencies Your requirements could not be resolved to an installable set of packages. Problem 1 - Root composer.json requires driftingly/rector-laravel ^1.2 -> satisfiable by driftingly/rector-laravel[1.2.0, ..., 1.2.6]. - Root composer.json requires larastan/larastan ^3.0 -> satisfiable by larastan/larastan[v3.0.0, ..., v3.13.0]. - larastan/larastan[v3.0.0, ..., v3.0.1] require phpstan/phpstan ^2.0.0 -> satisfiable by phpstan/phpstan[2.0.0, ..., 2.3.1]. - larastan/larastan v3.0.2 requires phpstan/phpstan ^2.0.2 -> satisfiable by phpstan/phpstan[2.0.2, ..., 2.3.1]. ... - larastan/larastan[v3.9.4, ..., v3.9.6] require phpstan/phpstan ^2.1.44 -> satisfiable by phpstan/phpstan[2.1.44, ..., 2.3.1]. - Conclusion: install phpstan/phpstan 1.12.34 (conflict analysis result) - You can only install one version of a package, so only one of these can be installed: phpstan/phpstan[1.11.0, ..., 1.12.34, 2.0.0, ..., 2.3.1]. Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.

"You can only install one version of a package"

La última línea sugiere usar -W, pero ya lo estamos usando: Composer lo sugiere siempre que no encuentra una combinación de versiones posible. El resto se lee de arriba abajo.

La primera línea indica qué paquete lo bloquea: nuestro composer.json tiene rector-laravel en ^1.2. Las siguientes dicen que todas las versiones de Larastan 3, de la versión 3.0.0 a la 3.13.0, necesitan PHPStan 2. Y la conclusión dice que Composer tiene que instalar PHPStan 1.12.34, porque la rama 1.2 de rector-laravel exige Rector 1 y Rector 1 exige PHPStan 1, y que no puede tener a la vez una versión de PHPStan 1 y otra de PHPStan 2. Es el conflicto que ya anticipamos en la lección 2 con composer why phpstan/phpstan: PHPStan 1 lo fijaban Larastan 2 y Rector 1.2, y hemos movido solo uno de los 2.

La solución es actualizar Rector de la versión 1.2 a la 2, que usa PHPStan 2, y con él rector-laravel de la rama 1 a la 2, que es la que funciona con Rector 2. Son 2 líneas más de require-dev en composer.json, en el mismo cambio que Larastan:

composer.json Modificado +2 −2
14 "spatie/laravel-permission": "^6.0"
15 },
16 "require-dev": {
− "driftingly/rector-laravel": "^1.2",
+ "driftingly/rector-laravel": "^2.0",
18 "fakerphp/faker": "^1.9.1",
19 "larastan/larastan": "^3.0",
20 "laravel/breeze": "^2.0",
24 "nunomaduro/collision": "^8.1",
25 "pestphp/pest": "^3.0",
26 "pestphp/pest-plugin-laravel": "^3.0",
− "rector/rector": "^1.2",
+ "rector/rector": "^2.0",
28 "spatie/laravel-ignition": "^2.0"
29 },
30 "autoload": {

Vamos a lanzar otra vez el mismo comando:

Terminal
sail composer update -W
Salida
Loading composer repositories with package information Updating dependencies Lock file operations: 0 installs, 5 updates, 0 removals - Upgrading driftingly/rector-laravel (1.2.6 => 2.5.0) - Upgrading iamcal/sql-parser (v0.5 => v0.7) - Upgrading larastan/larastan (v2.11.2 => v3.13.0) - Upgrading phpstan/phpstan (1.12.34 => 2.3.1) - Upgrading rector/rector (1.2.10 => 2.7.0) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 0 installs, 5 updates, 0 removals ... Found 4 security vulnerability advisories affecting 1 package. Run "composer audit" for a full list of advisories.

5 paquetes y ninguno más: Larastan 3.13, PHPStan 2.3, Rector 2.7, rector-laravel y iamcal/sql-parser, una dependencia de Larastan para leer los volcados SQL del esquema de la base de datos. Fíjate en rector-laravel: es la versión 2.5, la que ya anunciaba outdated en la lección 2, y tiene todo lo que necesitamos en este curso. Y laravel/framework sigue en la versión 11.57, otra vez gracias a las excepciones de los avisos de seguridad.

Lo que queda de esta lección
  1. 02rector.php sigue igual
  2. 03Lo que cambia en Larastan 3
  3. 04Lo que Larastan 3 señala en el proyecto
  4. 05Los tests, 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