Пример настройки PHPStan

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

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.

CI/CD (Github Actions)

Рекомендую добавить запуск phpstan в CI/CD. Таким образом, статический анализ будет запускаться для любых изменений в коде.

- name: Run phpstan
  run: vendor/bin/phpstan analyse

Пример

Для примера настроил PHPStan для проекта placeholder-service. Код доступен на gihub: https://github.com/antonshell/placeholder-service/pull/33

На этом пока все. Спасибо за внимание!