Rector Rules for Symfony
See available Symfony rules
Install
This package is already part of rector/rector package, so it works out of the box.
All you need to do is install the main package, and you're good to go:
composer require rector/rector --dev
Use Sets
To add a set to your config, use Rector\Symfony\Set\SymfonySetList
class and pick one of constants:
use Rector\Symfony\Set\SymfonySetList;
use Rector\Config\RectorConfig;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->symfonyContainerXml(__DIR__ . '/var/cache/dev/App_KernelDevDebugContainer.xml');
$rectorConfig->sets([
SymfonySetList::SYMFONY_62,
SymfonySetList::SYMFONY_CODE_QUALITY,
SymfonySetList::SYMFONY_CONSTRUCTOR_INJECTION,
]);
};
Configuration
Provide Symfony XML Service List
Some rules like StringFormTypeToClassRector
need access to your Symfony container dumped XML. It contains list of form types with their string names, so it can convert them to class references.
How to add it? Check your var/cache/
directory and find the XML file for your test env. Then add it in rector.php
:
use Rector\Config\RectorConfig;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->symfonyContainerXml(__DIR__ . '/var/cache/test/App_KernelTestDebugContainer.xml');
};
That's it! Now you can run the StringFormTypeToClassRector
and get your form classes converted safely.
Provide Symfony PHP Container
Some rules like AddRouteAnnotationRector
require additional access to your Symfony container. The rule takes container service "router" to load metadata about your routes.
use Rector\Config\RectorConfig;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->symfonyContainerPhp(__DIR__ . '/tests/symfony-container.php');
};
The tests/symfony-container.php
should provide your dependency injection container. The way you create the container is up to you. It can be as simple as:
// tests/symfony-container.php
use App\Kernel;
require __DIR__ . '/bootstrap.php';
$appKernel = new Kernel('test', false);
$appKernel->boot();
return $appKernel->getContainer();
The version of your Symfony can be quite old. Public methods are stable from Symfony 2 to through 6 and the router have not changed much. The AddRouteAnnotationRector
rule was tested and developed on Symfony 2.8 project.
Note: in this case, container cache PHP file located in /var/cache/<env>/appProjectContainer.php
is not enough. Why? Few services require Kernel to be set, e.g. routes that are resolved in lazy way. This container file is only dumped without Kernel and would crash with missing "kernel" error. That's why the rule needs full blown container.
Learn Rector Faster
Rector is a tool that we develop and share for free, so anyone can save hundreds of hours on refactoring. But not everyone has time to understand Rector and AST complexity. You have 2 ways to speed this process up:
- read a book - The Power of Automated Refactoring
- hire our experienced team to improve your code base
Both ways support us to and improve Rector in sustainable way by learning from practical projects.