Esta página complementa Desarrollo de paquetes Laravel, Probar paquetes Laravel con Orchestra Testbench y Gestión de la compatibilidad de versiones de paquetes. Añadir análisis estático a tu estrategia de implementación, tests y versiones te dará un paquete mucho más fácil de mantener a largo plazo.
Qué es el análisis estático
El análisis estático detecta incoherencias de tipos y bugs potenciales sin ejecutar el código. En los paquetes Laravel, con tantos mecanismos dinámicos (contenedor de servicios, facades, Eloquent), permite capturar problemas antes de que aparezcan en tiempo de ejecución. Introducir análisis estático aporta principalmente estos beneficios:- Mayor seguridad de tipos — detectas argumentos y retornos incorrectos antes de la review.
- Detección temprana de bugs — llamadas a métodos inexistentes o nullables olvidados salen antes de los tests.
- Mejor autocompletado del IDE — ajustar PHPDoc y generics eleva la precisión.
- Mantenimiento estable a largo plazo — es más fácil identificar qué se rompe al actualizar Laravel o PHP.
Configuración de PHPStan
Empieza montando la base de análisis con PHPStan solo. PHPStan 2.x es más estricto conmixed y los nullables que antes, lo que también es una buena excusa para pulir la API pública de tu paquete.
Primero, analiza directamente los directorios objetivo
En los paquetes suele empezarse con
src y tests.Configuración de Larastan
Con solo PHPStan, en un paquete Laravel no capturas del todo mecanismos específicos como la resolución vía contenedor, los facades o las relaciones de Eloquent. Por eso se combina con Larastan, la extensión de PHPStan para Laravel.Añade Larastan
Su nombre actual es
larastan/larastan. En artículos antiguos verás nunomaduro/larastan.Si desarrollas un paquete, instala también Testbench
Larastan arranca el contenedor de aplicación de Laravel para resolver tipos. Cuando analizas un paquete Laravel aislado, puede que necesites
orchestra/testbench.Configuración de phpstan.neon
phpstan.neon es el archivo central donde declaras el nivel de análisis, los paths a analizar, los excluidos y las reglas de excepción. En un paquete Laravel, es más realista empezar con una configuración que puedas ir endureciendo poco a poco que apuntar a la perfección desde el primer día.
Ejemplo de phpstan.neon:
Cómo elegir el nivel 0–9
PHPStan permite ir subiendo poco a poco. Es más seguro empezar por el nivel más alto que puedas ejecutar limpiamente y elevarlo a medida que arreglas problemas.| Nivel | Fase adecuada |
|---|---|
| 0–3 | Reducir primero llamadas a clases, funciones o métodos desconocidos. |
| 4–6 | Cuadrar los argumentos, retornos y propiedades de la API pública. |
| 7–9 | Fase de mantenimiento a largo plazo con nullables, uniones y mixed bajo control. |
paths
En paths declara explícitamente los directorios a analizar. En los paquetes es útil incluir no solo src, sino también tests, donde suele romperse la tipificación.
excludePaths
Excluye solo lo que no aporta al análisis (archivos generados, caché, el Workbench de verificación…). Si excluyes demasiado, dejarás fuera errores que sí querías detectar.
ignoreErrors
ignoreErrors es el último recurso. Restringe el mensaje con una expresión regular y usa también path para limitar el alcance. Así podrás retirar la excepción con facilidad si Laravel o Larastan mejoran en el futuro.
Anotaciones de tipo habituales
La precisión de PHPStan y Larastan depende mucho de cómo escribas los PHPDoc. En un paquete Laravel merece especialmente la pena cuidar@param, @return, @var y los generics (@template).
@param class-string<TModel>— indica que la cadena no es cualquiera, sino el nombre de una clase Model.@return TModel|null— comunica quefind()devuelve el tipo concreto del modelo.@var Collection<int, TModel>— explicita los tipos de clave y valor de la colección.@template TModel of Model— expresa un repositorio genérico reutilizable.
Consideraciones específicas de Laravel
La «magia» cómoda de Laravel no se transmite tal cual al análisis estático. Debes añadir información de tipos desde el paquete para que el analizador pueda entenderla.Facades
En facades personalizadas, describir con PHPDoc los métodos que el usuario invocará mejora tanto el IDE como el análisis estático.Métodos mágicos
Las APIs basadas en__call() o Macroable son cómodas, pero rompen fácilmente los tipos. Si van a formar parte de tu API pública, es más seguro añadir métodos wrapper explícitos con tipos claros de argumentos y retorno.
Tipar modelos Eloquent
Para las relaciones Eloquent y las propiedades dinámicas, combinar@property con generics de relación funciona muy bien.
Ejecución automática en CI
Ejecuta el análisis estático no solo en local, sino también en CI. Sobre todo si el paquete soporta varias versiones de Laravel, aplica la misma idea que la test matrix descrita en Gestión de la compatibilidad de versiones de paquetes: así vigilas compatibilidad y seguridad de tipos a la vez. Ejemplo de.github/workflows/static-analysis.yml:
Falsos positivos frecuentes y cómo tratarlos
Ante un warning de análisis estático, sospecha primero de la información de tipos: aunque parezca un falso positivo, muchas veces es simplemente PHPDoc insuficiente.@phpstan-ignore-next-line
Sirve como parche puntual, pero úsalo solo en líneas donde puedas explicar el motivo.
ignoreErrors
Considéralo solo cuando el mismo error aparece en varios sitios. Restringe siempre el path y no uses expresiones regulares laxas que silencien todo.
Prioridades al resolver un aviso
- Añadir PHPDoc.
- Declarar el tipo de retorno de facades y relaciones.
- Sustituir
mixedpor tipos concretos. - Solo entonces, ignorar los falsos positivos que puedas explicar.
Páginas relacionadas
Desarrollo de paquetes Laravel
Fundamentos de implementación de paquetes, incluyendo service providers y recursos publicados.
Probar paquetes Laravel con Orchestra Testbench
Base de pruebas ideal para combinar con análisis estático.
Gestión de la compatibilidad de versiones de paquetes
Estrategia para la tabla de compatibilidad Laravel / PHP y la matriz de GitHub Actions.