kaspiman/rector-longrunning-rules

Custom Rector rules for long-running PHP apps and more!

1.0.1 2024-10-08 12:20 UTC

This package is auto-updated.

Last update: 2024-11-08 12:33:07 UTC


README

Правила для анализатора Rector для поиска и устранения проблем в долгоживущих приложениях.

Внедрите Rector в пайплайн вашего проекта и постоянно контролируйте качество кода.

Используйте всё или то, что нужно.

Репозиторий подготовлен специально для конференции Podlodka PHP Crew (сезон 5) в рамках доклада "PHP будет долго жить. Переезжаем на Roadrunner" (будет ссылка на запись), презентация доступна по ссылке.

Использование

Установите Rector в проект:

composer require rector/rector --dev

Установите правила из этого репозитория:

composer require kaspiman/rector-longrunning-rules:^1.0 --dev

Добавьте и настройте правила в свой конфиг rector.php:

<?php

use Rector\Renaming\Rector\ConstFetch\RenameConstantRector;

return static function (RectorConfig $config): void {
    // общие настройки, к примеру директория с проектом...
    $config->paths([
        'src',
    ]);

    // Встроенное правило в Rector, запрещаем константу PHP_SAPI, меняя на несуществующую
    $config->ruleWithConfiguration(RenameConstantRector::class, [
        'PHP_SAPI' => 'FORBID',
    ]);

    // Правила без конфигурации
    $config->rules([
        IncludeRequireRector::class,
        ExitAndDieRector::class,
        EchoForbidRector::class,
    ]);

    // Правила с возможностью настроить поведение

    // Список глобальных переменных находится в файле, можно указать свой набор
    $config->ruleWithConfiguration(GlobalVarsForbidRector::class, [
        'vars' => include 'src/Rector/Resources/global-vars.php'
    ]);

    // Список запрещённых находится в файле, можно указать свой набор или перезаписать список отдельными функциями
    $config->ruleWithConfiguration(ForbiddenFunctionsRector::class, [
        'functions' => include 'src/Rector/Resources/forbidden-functions.php',
    ]);

    // Поиск скрытых состояний
    $config->ruleWithConfiguration(ResetStateCheckerRector::class, [
        'className' => ResetInterface::class, // Имя интерфейса для сброса, например у Symfony это Symfony\Contracts\Service\ResetInterface (https://github.com/symfony/contracts/blob/main/Service/ResetInterface.php)
        'methodName' => 'reset', // имя метод сброса у этого интерфейса
        'ignoreClassNames' => [], // Игнорирование определённых имён классов
        'ignoreClassPrefixes' => [  // Игнорирование определённых префиксов, например DTO и прочих объектов-переносчиков состояния
            'Dto',
            'Mock',
            'Stub',
            'Item',
            'Builder',
            'Collection',
            'Filter',
            'Criteria',
            'Context',
            'Container',
            'Object',
            'Aggregate',
            'Request',
            'Response',
            'Payload',
            'Event',
            'Exception',
            'Result',
            'Message',
            'Config',
            'Param',
            'Params',
            'Data',
        ],
        'ignoreAttributes' => [ // Игнорирование определённых аттрибутов, например сущностей Doctrine
            'Doctrine\ORM\Mapping\Entity',
        ],
    ]);
}

Запустите Rector в пробном режиме:

vendor/bin/rector --dry-run

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

public function work(): {
    /**
     * @rector-suppress ForbiddenFunctionsRector
     */
     ini_set('memory_limit', '42G');
}

Возможно игнорировать целый класс или его отдельные поля для правила ResetStateCheckerRector:

/**
* @rector-suppress ResetStateCheckerRector
*/
class SomeBadService {
   /**
    * @rector-suppress ResetStateCheckerRector
   */
   private array $cache = [];
}

Запустите Rector в рабочем режиме и примените изменения в коду, проверьте корректность:

vendor/bin/rector

Готово.