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 😄