PHPStan: percorsi dei file cliccabili nel terminale grazie a phpstan.neon
Supponiamo che il tuo progetto PHP/Laravel abbia una struttura simile a questa:
.
├── artisan
├── (...)
├── routes
├── src
│ ├── App
│ └── Domain
├── (...)
├── vendor
└── vite.config.js
Stai lavorando con PHPStan nel terminale e, quando analizza il tuo codice, gli errori si presentano così:
------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------
Line App/Concerns/PasswordValidationRules.php (in context of class App\Actions\Fortify\CreateNewUser)
------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------
17 Method App\Actions\Fortify\CreateNewUser::passwordRules() should return array<int, array<mixed>|Illuminate\Contracts\Validation\ValidationRule|string> but returns
array<int, Illuminate\Validation\Rules\Password|string>.
🪪 return.type
------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------
Apparentemente i percorsi indicati sono corretti, ma scopri che in realtà sono incompleti: manca la parte iniziale
che li àncora alla root del progetto. Terminali come iTerm2, o il terminale integrato di PhpStorm e VS Code, riescono
a rendere correttamente cliccabile un percorso relativo solo se è completo rispetto alla root del progetto. In questo
caso,
il percorso corretto nel filesystem è src/App/Concerns/PasswordValidationRules.php.
Con un percorso troncato come App/Concerns/PasswordValidationRules.php, il terminale non sa dove cercare il file o
interpreta i link in maniera errata.
Nel mio caso (utilizzo iTerm 2 su macOS), quando premo CMD e faccio click sul link, questo viene interpretato come un
indirizzo di tipo http:// e quindi aperto nel browser (che non sa cosa fare).
Perché succede?
Se il tuo phpstan.neon è simile a questo:
parameters:
paths:
- src
…allora PHPStan riporta i percorsi degli errori relativamente a quest’unica sottodirectory, facendoli risultare incompleti:
Il percorso App/Concerns/PasswordValidationRules.php è relativo a src, non alla root del progetto. Il terminale non
riesce a
risolverlo e il link non funziona.
La soluzione
Il modo più semplice è impostare due o più percorsi nel nodo paths di phpstan.neon:
parameters:
paths:
- src
- tests
In questo modo gli errori saranno riportati con percorsi completi relativi alla root:
------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------
Line src/App/Concerns/PasswordValidationRules.php (in context of class App\Actions\Fortify\CreateNewUser)
------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------
17 Method App\Actions\Fortify\CreateNewUser::passwordRules() should return array<int, array<mixed>|Illuminate\Contracts\Validation\ValidationRule|string> but returns
array<int, Illuminate\Validation\Rules\Password|string>.
🪪 return.type
------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------
Il percorso src/App/Concerns/PasswordValidationRules.php ora è completo e cliccabile: con un click si apre
direttamente il file alla riga giusta nell’IDE.
Soluzione alternativa
E se per qualche motivo vuoi che PHPStan analizzi solamente una cartella (es. src)?
Aggiungi questo blocco in phpstan.neon:
services:
relativePathHelper:
class: PHPStan\File\SimpleRelativePathHelper
arguments:
currentWorkingDirectory: %currentWorkingDirectory%
Conclusione
Una piccola svista nella configurazione di phpstan.neon è sufficiente a rendere i percorsi negli errori inutilizzabili
nel terminale. Con la giusta configurazione, i percorsi risulteranno
completi e cliccabili, permettendo di navigare direttamente al problema con un click.
Migliore Developer eXperience = sviluppatore più felice 😄