2021-05-10 18:06:54 +00:00
# Rector - Instant Upgrades and Automated Refactoring
2017-07-15 19:20:20 +02:00
2021-05-10 18:06:54 +00:00
[![Downloads ](https://img.shields.io/packagist/dt/rector/rector.svg?style=flat-square )](https://packagist.org/packages/rector/rector)
2020-10-29 10:44:07 +01:00
2021-05-10 18:06:54 +00:00
< br >
2020-10-29 10:44:07 +01:00
2022-01-25 08:37:12 +00:00
Rector instantly upgrades and refactors the PHP code of your application. It can help you in 2 major areas:
2021-05-10 18:06:54 +00:00
2021-05-23 15:11:41 +00:00
### 1. Instant Upgrades
2021-05-10 18:06:54 +00:00
2022-08-07 14:40:46 +00:00
Rector now supports upgrades from PHP 5.3 to 8.1 and major open-source projects like [Symfony ](https://github.com/rectorphp/rector-symfony ), [PHPUnit ](https://github.com/rectorphp/rector-phpunit ), [Laravel ](https://github.com/rectorphp/rector-laravel ), [CakePHP ](https://github.com/rectorphp/rector-cakephp ) and [Doctrine ](https://github.com/rectorphp/rector-doctrine ). Do you want to **be constantly on the latest PHP and Framework without effort** ?
2021-05-10 18:06:54 +00:00
2021-05-23 15:11:41 +00:00
Use Rector to handle **instant upgrades** for you.
2021-05-10 18:06:54 +00:00
2021-05-23 15:11:41 +00:00
### 2. Automated Refactoring
2021-05-10 18:06:54 +00:00
2022-01-25 10:05:47 +00:00
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?
2021-05-10 18:06:54 +00:00
2021-05-23 15:11:41 +00:00
Add Rector to your CI and let it **continuously refactor your code** and keep the code quality high.
2021-05-10 18:06:54 +00:00
< br >
2021-05-23 15:11:41 +00:00
## Read a First Book About Rector
2021-05-10 18:06:54 +00:00
2021-05-23 15:11:41 +00:00
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* .
2021-05-10 18:06:54 +00:00
2021-05-23 15:11:41 +00:00
< a href = "https://leanpub.com/rector-the-power-of-automated-refactoring" >
< img src = "https://github.com/rectorphp/the-power-of-automated-refactoring-feedback/raw/main/images/book_title.png" >
< / a >
2021-05-10 18:06:54 +00:00
2021-05-23 15:11:41 +00:00
By [buying a book ](https://leanpub.com/rector-the-power-of-automated-refactoring ) you directly support maintainers who are working on Rector.
2021-05-10 18:06:54 +00:00
< br >
## Documentation
2022-08-14 12:43:17 +00:00
- [Explore 400+ Rector Rules ](/docs/rector_rules_overview.md )
2021-05-10 18:06:54 +00:00
- [How to Ignore Rule or Paths ](/docs/how_to_ignore_rule_or_paths.md )
- [Static Reflection and Autoload ](/docs/static_reflection_and_autoload.md )
- [How to Configure Rule ](/docs/how_to_configure_rules.md )
2022-04-12 08:58:57 +00:00
- [Auto Import Names ](/docs/auto_import_names.md )
2021-05-10 18:06:54 +00:00
2021-05-23 15:11:41 +00:00
### For Rule Developers and Contributors
2021-05-10 18:06:54 +00:00
2022-04-12 08:58:57 +00:00
- [How to add Test for Rector Rule ](/docs/how_to_add_test_for_rector_rule.md )
2021-05-23 15:11:41 +00:00
- [How Does Rector Work? ](/docs/how_it_works.md )
- [PHP Parser Nodes ](https://github.com/rectorphp/php-parser-nodes-docs/ )
- [How to Work with Doc Block and Comments ](/docs/how_to_work_with_doc_block_and_comments.md )
- [How to Generate New Rector Rule ](/docs/create_own_rule.md )
2022-04-12 08:58:57 +00:00
See [the full documentation ](/docs ).
2021-05-10 18:06:54 +00:00
< br >
2021-01-12 14:41:47 +01:00
2017-07-15 19:20:20 +02:00
## Install
```bash
2018-10-07 01:28:57 +08:00
composer require rector/rector --dev
2017-07-15 19:20:20 +02:00
```
2021-05-10 18:06:54 +00:00
< br >
## Running Rector
2022-01-25 08:37:12 +00:00
There are 2 main ways to use Rector:
2021-05-10 18:06:54 +00:00
- 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:
2020-10-29 10:44:07 +01:00
```bash
vendor/bin/rector init
2021-05-10 18:06:54 +00:00
```
2020-10-29 10:44:07 +01:00
2021-05-10 18:06:54 +00:00
And modify it:
```php
use Rector\Php74\Rector\Property\TypedPropertyRector;
use Rector\Set\ValueObject\SetList;
2022-04-12 11:52:08 +00:00
use Rector\Config\RectorConfig;
2021-05-10 18:06:54 +00:00
2022-04-12 11:52:08 +00:00
return static function (RectorConfig $rectorConfig): void {
2021-05-10 18:06:54 +00:00
// here we can define, what sets of rules will be applied
// tip: use "SetList" class to autocomplete sets
2022-04-12 11:52:08 +00:00
$rectorConfig->sets([
SetList::CODE_QUALITY
]);
2021-05-10 18:06:54 +00:00
// register single rule
2022-04-12 11:52:08 +00:00
$rectorConfig->rule(TypedPropertyRector::class);
2021-05-10 18:06:54 +00:00
};
```
Then dry run Rector:
```bash
2020-08-24 23:25:26 +02:00
vendor/bin/rector process src --dry-run
2021-05-10 18:06:54 +00:00
```
Rector will show you diff of files that it *would* change. To *make* the changes, drop `--dry-run` :
2019-11-08 17:49:03 +01:00
2021-05-10 18:06:54 +00:00
```bash
2020-05-03 14:19:09 +02:00
vendor/bin/rector process src
```
2021-05-10 18:06:54 +00:00
*Note: `rector.php` is loaded by default. For different location, use `--config` option.*
2021-07-21 08:58:31 +00:00
*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.*
2021-05-10 18:06:54 +00:00
< br >
## Configuration
```php
// rector.php
use Rector\Core\ValueObject\PhpVersion;
2022-04-12 11:52:08 +00:00
use Rector\Config\RectorConfig;
2021-05-10 18:06:54 +00:00
2022-04-12 11:52:08 +00:00
return static function (RectorConfig $rectorConfig): void {
2021-05-10 18:06:54 +00:00
// paths to refactor; solid alternative to CLI arguments
2022-04-12 11:52:08 +00:00
$rectorConfig->paths([__DIR__ . '/src', __DIR__ . '/tests']);
2021-05-10 18:06:54 +00:00
2022-03-11 14:35:55 +00:00
// is your PHP version different from the one you refactor to? [default: your PHP version], uses PHP_VERSION_ID format
2022-04-12 14:41:09 +00:00
$rectorConfig->phpVersion(PhpVersion::PHP_72);
2021-05-10 18:06:54 +00:00
2022-03-11 14:35:55 +00:00
// Path to PHPStan with extensions, that PHPStan in Rector uses to determine types
2022-04-12 11:52:08 +00:00
$rectorConfig->phpstanConfig(__DIR__ . '/phpstan-for-config.neon');
2021-05-10 18:06:54 +00:00
};
```
< br >
2022-08-10 10:06:27 +00:00
## Empowered by Rector Community :heart:
2022-08-10 09:53:54 +00:00
The Rector community is powerful thanks to active maintainers who take care of Rector sets for particular projects.
Among there projects belong:
* [palantirnet/drupal-rector ](https://github.com/palantirnet/drupal-rector )
* [craftcms/rector ](https://github.com/craftcms/rector )
* [FriendsOfShopware/shopware-rector ](https://github.com/FriendsOfShopware/shopware-rector )
* [sabbelasichon/typo3-rector ](https://github.com/sabbelasichon/typo3-rector )
* [sulu/sulu-rector ](https://github.com/sulu/sulu-rector )
* [efabrica-team/rector-nette ](https://github.com/efabrica-team/rector-nette )
* [Sylius/SyliusRector ](https://github.com/Sylius/SyliusRector )
2022-08-10 10:06:27 +00:00
* [CoditoNet/rector-money ](https://github.com/CoditoNet/rector-money )
* [laminas/laminas-servicemanager-migration ](https://github.com/laminas/laminas-servicemanager-migration )
2022-08-10 09:53:54 +00:00
< br >
2022-08-10 10:06:27 +00:00
## Hire us to get Job Done :muscle:
2021-05-23 15:11:41 +00:00
Rector is a tool that [we develop ](https://getrector.org/ ) 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 ](https://getrector.org/contact ) to get there faster.
< br >
2021-05-10 18:06:54 +00:00
## How to Contribute
2022-01-21 10:58:31 +00:00
See [the contribution guide ](/CONTRIBUTING.md ) or go to development repository [rector/rector-src ](https://github.com/rectorphp/rector-src ).
2021-05-10 18:06:54 +00:00
< br >
2021-05-23 15:11:41 +00:00
## Debugging
2021-05-10 18:06:54 +00:00
You can use `--debug` option, that will print nested exceptions output:
```bash
vendor/bin/rector process src/Controller --dry-run --debug
```
Or with Xdebug:
1. Make sure [Xdebug ](https://xdebug.org/ ) is installed and configured
2. Add `--xdebug` option when running Rector
```bash
vendor/bin/rector process src/Controller --dry-run --xdebug
```
2022-01-25 08:37:12 +00:00
To assist with simple debugging Rector provides 2 helpers to pretty-print AST-nodes:
2021-05-10 18:06:54 +00:00
```php
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);
```
< br >
## Known Drawbacks
### How to Apply Coding Standards?
Rector uses [nikic/php-parser ](https://github.com/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.
2021-06-17 09:46:43 +00:00
We're using [ECS ](https://github.com/symplify/easy-coding-standard ) with [this setup ](https://github.com/rectorphp/rector-src/blob/main/ecs.php ).