30 мая 2024 г.
Всем привет! Сегодня хотел бы поделиться примером настройки инструмента статического анализа для PHP - PHPStan.
Сам инструмент, вероятно, в представлении не нуждается. Я использовал его в одном из своих проектов, и остался доволен. PHPStan помогает поддерживать код в хорошем состоянии, и особенно хорошо помогает находить ошибки типизации. Иногда бывает немного занудным, но в конечном итоге, все это к лучшему.
Установка описана в документации Здесь все просто. Устанавливаем через composer с флагом dev.
composer require --dev phpstan/phpstan
Затем нужно создать конфигурационный файл phpstan.dist.neon
. Указываем директории с кодом и уровень анализа.
parameters:
level: 6
paths:
- bin/
- config/
- public/
- src/
- tests/
Для symfony проекта он создался автоматически с помощью symfony/flex.
Запустим статический анализ такой командой:
vendor/bin/phpstan analyse
Видим вывод консоли и, скорее всего, ошибки.
Можно попробовать исправить ошибки и снова запустить PHPStan. Но, скорее всего, для реального проекта вы не захотите это делать сразу. Это может оказаться трудоемкой и небыстрой задачей. Поэтому...
Baseline запишет имеющиеся ошибки в специальный файл. Таким образом мы зафиксируем текущее состояние проекта и начнем использовать PHPStan.
Сгенерируем baseline такой командой:
vendor/bin/phpstan analyse --generate-baseline
Будет создан файл phpstan-baseline.neon
такого вида:
parameters:
ignoreErrors:
-
message: "#^Access to undefined constant Symfony\\\\Component\\\\HttpFoundation\\\\Request\\:\\:HEADER_X_FORWARDED_ALL\\.$#"
count: 1
path: public/index.php
-
message: "#^Method App\\\\Tests\\\\Controller\\\\MainControllerTest\\:\\:imageDataProvider\\(\\) return type has no value type specified in iterable type array\\.$#"
count: 1
path: tests/Controller/MainControllerTest.php
В нем перечислены все ошибки, сгруппированные по файлам и количеству. Таким образом, существующие ошибки будут игнорироваться. А на новые ошибки будут выводиться сообщения.
Укажем файл baseline в файле конфигурации phpstan.dist.neon
.
includes:
- phpstan-baseline.neon
parameters:
level: 6
paths:
- bin/
- config/
- public/
- src/
- tests/
Теперь снова запустим статический анализ:
vendor/bin/phpstan analyse
Теперь ошибок больше нет.
Со временем можно исправлять имеющиеся ошибки и удалять записи из baseline. Желательно не добавлять в baseline новые записи, а только удалять имеющиеся. Таким образом состояние проекта будет постепенно улучшаться.
Подробнее про baseline.
Рекомендую добавить запуск phpstan в CI/CD. Таким образом, статический анализ будет запускаться для любых изменений в коде.
- name: Run phpstan
run: vendor/bin/phpstan analyse
Для примера настроил PHPStan для проекта placeholder-service. Код доступен на gihub: https://github.com/antonshell/placeholder-service/pull/33
На этом пока все. Спасибо за внимание!