* numbers * update ECS config to Symplify 9 * regenerate rules with categorize * [CI] disable automated rebase, as not working propperly * update misc
Rector - Speedup Your PHP Development
Rector helps you with 2 areas - major code changes and in daily work.
- Do you have a legacy code base? Do you want to have that latest version of PHP or your favorite framework? → Rector gets you there with instant upgrade.
- Do you have code quality you need, but struggle to keep it with new developers in your team? Do you wish to have code-reviews for each member of your team, but don't have time for it? → Add Rector to you CI and let it fix your code for you. Get instant feedback after each commit.
It's a tool that we develop and share for free, so you anyone can automate their refactoring.
Hire us to skip learning Rector, AST and nodes, to educate your team about Rectors benefits and to setup Rector in your project - so you can enjoy the 300 % development speed 👍
Show Case: Complete 2700 @var
annotations in 2 mins
Open-Source First
Rector instantly upgrades and refactors the PHP code of your application. It supports all versions of PHP from 5.2 and major open-source projects:
What Can Rector Do for You?
- Upgrade 30 000 unit tests from PHPUnit 6 to 9 in 2 weeks
- Complete PHP 7.4 property type declarations
- Migrate your project from Nette to Symfony
- Refactor Laravel Facades to Dependency Injection
- And much more...
Documentation
Advanced
- How To Run Rector on Changed Files Only
- How Run One Rule From Command Line
- How to Ignore Rule or Paths
- How to Configure Rule
- How run Rector in Docker
- Add Checkstyle with your CI
Contributing
- How to Add Test for Rector Rule
- How to Create New Rector Rule
- How to Generate New Rector Rule with Recipe
Install
composer require rector/rector --dev
- Having conflicts during
composer require
? → Use the Rector Prefixed - Using a different PHP version than Rector supports? → Use the Docker image
Running Rector
There a 2 main ways to use Rector:
- a single rule, to have the change under control - you can choose from over 600 rules
- or group of rules called sets - pick from sets
To use them, create a rector.php
in your root directory:
vendor/bin/rector init
And modify it:
// rector.php
use Rector\Core\Configuration\Option;
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
$parameters = $containerConfigurator->parameters();
$parameters->set(Option::SETS, [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.
Full Config Configuration
// rector.php
use Rector\Core\Configuration\Option;
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']);
// Rector relies on autoload setup of your project; Composer autoload is included by default; to add more:
$parameters->set(Option::AUTOLOAD_PATHS, [
// autoload specific file
__DIR__ . '/vendor/squizlabs/php_codesniffer/autoload.php',
// or full directory
__DIR__ . '/vendor/project-without-composer',
]);
// is your PHP version different from the one your refactor to? [default: your PHP version]
$parameters->set(Option::PHP_VERSION_FEATURES, '7.2');
// auto import fully qualified class names? [default: false]
$parameters->set(Option::AUTO_IMPORT_NAMES, true);
// skip root namespace classes, like \DateTime or \Exception [default: true]
$parameters->set(Option::IMPORT_SHORT_CLASSES, false);
// skip classes used in PHP DocBlocks, like in /** @var \Some\Class */ [default: true]
$parameters->set(Option::IMPORT_DOC_BLOCKS, false);
// Run Rector only on changed files
$parameters->set(Option::ENABLE_CACHE, true);
};
Symfony Container
To work with some Symfony rules, you now need to link your container XML file
// rector.php
use Rector\Core\Configuration\Option;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$parameters = $containerConfigurator->parameters();
$parameters->set(
Option::SYMFONY_CONTAINER_XML_PATH_PARAMETER,
__DIR__ . '/var/cache/dev/AppKernelDevDebugContainer.xml'
);
};
How to Contribute
Debugging
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
Community Packages
Do you use Rector to upgrade your code? Add it here:
Known Drawbacks
How to Apply Coding Standards?
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.
Don't have a coding standard tool? Add ECS and use prepared ecs-after-rector.php
set.