Настройка и проверка PHPStan

Что такое PHPStan?

PHPStan – это мощный статический анализатор, который помогает находить ошибки в коде без его выполнения. Он анализирует типы данных, возможные ошибки, нарушение контрактов и другие проблемы, которые могут привести к багам в продакшене. Если вы используете Laravel, то стандартного PHPStan может быть недостаточно. Специально для Laravel существует расширение Larastan, которое учитывает особенности фреймворка, такие как Eloquent-модели, фасады и контейнер зависимостей.

Установка и настройка Larastan (в т.ч. PHPStan)

1. Устанавливаем Larastan через Composer:

composer require --dev larastan/larastan 

в данном случае, пакет phpstan/phpstan установится, как зависимость, вместе с Larastan

2. Создаем конфигурационный файл phpstan.neon в корне проекта:

includes:
    - ./vendor/larastan/larastan/extension.neon
parameters:
    paths:
        - app/
        - app-modules/
    # Level 9 is the highest level
    level: 8

    stubFiles:
    - vendor/nuwave/lighthouse/_ide_helper.php

    checkModelProperties: true
    checkGenericClassInNonGenericObjectType: false

    excludePaths:
  ...

Здесь мы подключаем Larastan – расширение PHPStan для Laravel, а также задаём 8 (из 9) уровень проверки. Paths – указываем какие папки необходимо проверять. Секция stubFiles указывает PHPStan на файлы заглушек. Эти файлы помогают анализатору понимать код, который иначе был бы для него недоступен. checkModelProperties - включает проверку свойств моделей Eloquent. checkGenericClassInNonGenericObjectType - отключает строгую проверку generic-классов, когда они используются как обычные объекты. В секции excludePaths можно указать пути, по которым не требуется проверка phpstan.

3. Запускаем анализ кода:

vendor/bin/phpstan analyse

Кроме проверок на этапе написания кода, мы используем автоматическую проверку кода перед развертыванием. Мы добавили в .gitlab-ci.yml строку запуска проверки

сode static analyze:
stage: analyze
image: registry.dev-mage3.com/developers/astrio-laravel:base
dependencies:
    - composer 
 before_script:
    - cd app  script:
    - ./vendor/bin/phpstan analyze app/ app-modules/ --memory-limit 2048M
  allow_failure: true
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'dev'  
tags: [ dind ]

После этого PHPStan запускается автоматически, когда создаётся merge request в ветку dev.

Настройка и проверка Laravel Pint

Что такое Laravel Pint?

Laravel Pint – это инструмент для автоматического форматирования кода в соответствии с код-стандартами Laravel. Он помогает поддерживать единый стиль кода без необходимости вручную исправлять форматирование.

Установка Laravel Pint

Устанавливаем через Composer:

composer require --dev laravel/pint

Запускать Pint можно командой с консоли

vendor/bin/pint

Настройки хранятся в корне проекта в файле pint.json. Вот пример, который у нас используется на одном из проектов:

используется на одном из проектов:
{
    "preset": "laravel",
    "rules": {
        "strict_param": false,
        "array_syntax": {
            "syntax": "short"
        },
        "declare_strict_types": true,
        "comment_to_phpdoc": true
    },
    "exclude": [
    ]
}

Preset - используется Laravel-стиль кодирования. strict_param - строгая проверка параметров отключена. "syntax": "short" - включён короткий синтаксис массивов []. declare_strict_types - добавляется declare(strict_types=1); в начало файлов. comment_to_phpdoc - обычные комментарии превращаются в PHPDoc.

Laravel Pint – это инструмент для автоматического форматирования кода, который можно легко интегрировать в PhpStorm. Для этого указываем в настройках File → Settings. Php – Quality Tools – Laravel Pint. Указываем путь к Pint, например app/vendor/bin/pint, указываем путь к настройкам.

После этого в редакторе будет появляться подсказка с предложением исправить код

Laravel Pint автоматически форматирует код, приводя его к единому стилю, что делает его чище и удобнее для чтения. Он исправляет отступы, удаляет лишние пробелы и пустые строки, приводит массивы к короткому синтаксису и унифицирует кавычки. Также Pint добавляет строгую типизацию, исправляет комментарии и DocBlock, упрощает конструкции функций и убирает дублирующиеся импорты. Это помогает поддерживать код в чистом состоянии и снижает вероятность ошибок.

Настройка и проверка Laravel IDE Helper

Что такое Laravel IDE Helper?

Laravel IDE Helper создаёт вспомогательные файлы для улучшения автодополнения в PhpStorm и других IDE. Это делает разработку удобнее, особенно при работе с фасадами, моделями и сервисами Laravel/

Установка и генерация файлов

Устанавливаем пакет:

composer require --dev barryvdh/laravel-ide-helper

Публикуем конфигурацию

php artisan vendor:publish --provider="Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider" --tag=config

После установки мы прописали в composer.json команду для автоматической генерации подсказок при обновлении зависимостей. В разделе scripts.post-update-cmd указали следующий код:

"post-update-cmd": [
 ....
    "@php artisan ide-helper:generate",
    "@php artisan ide-helper:meta",
    "@php artisan lighthouse:ide-helper"
]

Если вы хотите выполнить генерацию вручную, используйте следующие команды:

php artisan ide-helper:generate
php artisan ide-helper:meta
php artisan lighthouse:ide-helper

Преимущества использования IDE Helper

1. Улучшенное автодополнение - IDE (например, PhpStorm, VS Code) смогут точно определять методы фасадов Laravel, например:

use Illuminate\Support\Facades\Cache;
Cache::put('key', 'value', 600); // Без IDE Helper – методы могут быть не распознаны

2.Подсказки по моделям - После генерации ide-helper:models в коде появятся аннотации с доступными свойствами моделей:

/**
 * App\Models\User
 *
 * @property int $id
 * @property string $name
 * @property string $email
 * @property \Illuminate\Support\Carbon $created_at
 * @property \Illuminate\Support\Carbon $updated_at
 */
class User extends Model {}

Теперь при обращении к $user->name IDE будет знать, что это строка.

3.GraphQL (Lighthouse) - Если используется Lighthouse, команда lighthouse:ide-helper генерирует корректные типы для GraphQL-запросов, улучшая автодополнение схем и резолверов.

Использование IDE Helper делает разработку в Laravel удобнее: снижает вероятность ошибок, ускоряет написание кода и улучшает читаемость. Настроив автоматическую генерацию в composer.json, можно избежать необходимости ручного обновления подсказок после изменения зависимостей. 

Дополнительно, это позволяет:

1. Экономить время разработчиков за счёт корректного автодополнения.

2. Улучшить качество кода, снижая вероятность использования несуществующих методов и свойств.

3. Делать код более понятным и самодокументируемым за счёт аннотаций.

4. Упростить работу с GraphQL при использовании Lighthouse.

5. Все эти преимущества делают IDE Helper незаменимым инструментом при разработке сложных проектов на Laravel.

Выводы

Использование PHPStan, Laravel Pint и Laravel IDE Helper в связке даёт максимально эффективный контроль качества кода в Laravel-проектах.

PHPStan обеспечивает статический анализ кода, выявляя ошибки, потенциальные баги и нарушения строгой типизации до момента выполнения. Это делает код безопаснее и уменьшает количество неожиданных ошибок в продакшене.

Laravel Pint автоматически форматирует код в соответствии с современными стандартами. Он устраняет стилистические недочёты, унифицирует синтаксис и повышает читаемость, упрощая командную работу.

Laravel IDE Helper значительно улучшает автодополнение и навигацию в PhpStorm и других IDE. Он устраняет проблему "магических методов" Laravel, делая работу с кодом удобнее и эффективнее.

Почему именно этот стек инструментов?

Эти три инструмента идеально дополняют друг друга:

1. PHPStan помогает находить логические ошибки.

2. Pint автоматически поддерживает кодстайл.

3. IDE Helper делает работу с Laravel в IDE интуитивной и предсказуемой.

Для Laravel нет более мощного набора инструментов, обеспечивающего чистоту, качество и удобство работы с кодом