Rector instantly upgrades and refactors the PHP code of your application. It can help you in 2 major areas:
Rector now supports upgrades from PHP 5.3 to 8.0 and major open-source projects like Symfony, PHPUnit, Nette, Laravel, CakePHP, Doctrine, PHPOffice and TYPO3 out of the box. Do you want to be constantly on the latest PHP/framework version without effort?
Use Rector to handle instant upgrades for you.
Do you have code quality you need, but struggle to keep it with new developers in your team? Do you want to see smart code-reviews even when every senior developers sleeps?
Add Rector to your CI and let it continuously refactor your code and keep the code quality high.
Are you curious, how Rector works internally, how to create your own rules and test them and why Rector was born? In May 2021 we've released the very first book: Rector - The Power of Automated Refactoring.
By buying a book you directly support maintainers who are working on Rector.
- Explore 450+ Rector Rules
- Auto Import Names
- How to Ignore Rule or Paths
- Static Reflection and Autoload
- How to Configure Rule
- Beyond PHP - Entering the realm of FileProcessors
- How Does Rector Work?
- PHP Parser Nodes
- How to Work with Doc Block and Comments
- How to Generate New Rector Rule
- How to add Test for Rector Rule
- How to create a custom FileProcessor
composer require rector/rector --dev
There are 2 main ways to use Rector:
- a single rule, to have the change under control
- or group of rules called sets
To use them, create a rector.php
in your root directory:
vendor/bin/rector init
And modify it:
// rector.php
use Rector\Php74\Rector\Property\TypedPropertyRector;
use Rector\Set\ValueObject\SetList;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
// here we can define, what sets of rules will be applied
// tip: use "SetList" class to autocomplete sets
$containerConfigurator->import(SetList::CODE_QUALITY);
// register single rule
$services = $containerConfigurator->services();
$services->set(TypedPropertyRector::class);
};
Then dry run Rector:
vendor/bin/rector process src --dry-run
Rector will show you diff of files that it would change. To make the changes, drop --dry-run
:
vendor/bin/rector process src
Note: rector.php
is loaded by default. For different location, use --config
option.
Note: Rector will only update legacy code to utilize new features which are supported by the PHP version defined in your composer.json
file. For instance, if require.php is >=7.2.5
, Rector will not make changes which are only available for PHP versions after 7.2.5.
// rector.php
use Rector\Core\Configuration\Option;
use Rector\Core\ValueObject\PhpVersion;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$parameters = $containerConfigurator->parameters();
// paths to refactor; solid alternative to CLI arguments
$parameters->set(Option::PATHS, [__DIR__ . '/src', __DIR__ . '/tests']);
// is your PHP version different from the one you refactor to? [default: your PHP version], uses PHP_VERSION_ID format
$parameters->set(Option::PHP_VERSION_FEATURES, PhpVersion::PHP_72);
// Path to PHPStan with extensions, that PHPStan in Rector uses to determine types
$parameters->set(Option::PHPSTAN_FOR_RECTOR_PATH, getcwd() . '/phpstan-for-config.neon');
};
Rector is a tool that we develop and share for free, so anyone can automate their refactoring. But not everyone has dozens of hours to understand complexity of abstract-syntax-tree in their own time. That's why we provide commercial support - to save your time.
Would you like to apply Rector on your code base but don't have time for the struggle with your project? Hire us to get there faster.
See the contribution guide or go to development repository rector/rector-src.
-
codito/rector-money
: set of rules related tomoneyphp/money
library. It can help you with upgrading to v4.0 or make your codebase compatible for future upgrade. -
laminas/laminas-servicemanager-migration
: set of rules related tolaminas-servicemanager
library. It can help migrate your code to laminas-servicemanager 4.x compatibility.
You can use --debug
option, that will print nested exceptions output:
vendor/bin/rector process src/Controller --dry-run --debug
Or with Xdebug:
- Make sure Xdebug is installed and configured
- Add
--xdebug
option when running Rector
vendor/bin/rector process src/Controller --dry-run --xdebug
To assist with simple debugging Rector provides 2 helpers to pretty-print AST-nodes:
use PhpParser\Node\Scalar\String_;
$node = new String_('hello world!');
// prints node to string, as PHP code displays it
print_node($node);
// dump nested node object with nested properties
dump_node($node);
// 2nd argument is how deep the nesting is - this makes sure the dump is short and useful
dump_node($node, 1);
Rector uses nikic/php-parser, built on technology called an abstract syntax tree (AST). An AST doesn't know about spaces and when written to a file it produces poorly formatted code in both PHP and docblock annotations. That's why your project needs to have a coding standard tool and a set of formatting rules, so it can make Rector's output code nice and shiny again.
We're using ECS with this setup.