2020-10-04 13:12:41 +02:00
# Rector - Speedup Your PHP Development
2017-07-15 19:20:20 +02:00
2020-10-29 10:44:07 +01:00
[![Coverage Status ](https://img.shields.io/coveralls/rectorphp/rector/master.svg?style=flat-square )](https://coveralls.io/github/rectorphp/rector?branch=master)
[![Downloads ](https://img.shields.io/packagist/dt/rector/rector.svg?style=flat-square )](https://packagist.org/packages/rector/rector)
[![SonarCube ](https://img.shields.io/badge/SonarCube_Debt-%3C30-brightgreen.svg?style=flat-square )](https://sonarcloud.io/dashboard?id=rectorphp_rector)
< br >
2020-10-04 13:12:41 +02:00
Rector helps you with 2 areas - major code changes and in daily work.
2020-10-09 22:37:36 +02:00
- Do you have a legacy code base? Do you want to have that latest version of PHP or your favorite framework?
2020-10-04 13:12:41 +02:00
→ **Rector gets you there with instant upgrade** .
< br >
- 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](https://tomasvotruba.com/blog/2020/01/13/why-is-first-instant-feedback-crucial-to-developers/) after each commit.**
2020-10-29 10:44:07 +01:00
< br >
2020-12-15 13:11:31 +01:00
It's a tool that [we develop ](https://getrector.org/ ) and share for free, so anyone can automate their refactoring.
2020-10-09 22:37:36 +02:00
2020-12-15 13:11:31 +01:00
[Hire us ](https://getrector.org/contact ) to skip learning Rector, AST and nodes, to educate your team about Rectors benefits and to setup Rector in your project, so that you can enjoy the 300 % development speed :+1:
2018-02-02 17:51:41 +01:00
2020-02-21 15:26:02 +01:00
< br >
2020-10-29 10:44:07 +01:00
- **[Try Rector Online ](https://getrector.org/demo )**
2020-02-21 15:26:02 +01:00
2020-10-29 10:44:07 +01:00
## Show Case: Complete 2700 `@var` annotations in 2 mins
2020-02-13 17:13:49 +01:00
2019-10-19 12:42:36 +02:00
![Rector-showcase ](docs/images/rector-showcase-var.gif )
2018-01-13 16:01:31 +01:00
2020-10-29 10:44:07 +01:00
[How does this work? ](https://tomasvotruba.com/blog/2019/01/03/how-to-complete-type-declarations-without-docblocks-with-rector/ )
2019-08-19 15:49:41 +02:00
2019-04-29 23:42:11 +02:00
< br >
## Open-Source First
2020-10-29 10:44:07 +01:00
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:
2017-07-15 19:20:20 +02:00
2018-10-21 11:00:39 +02:00
< br >
2017-10-30 16:00:28 +01:00
< p align = "center" >
2020-10-09 14:52:33 +07:00
< a href = "/config/set/" > < img src = "/docs/images/php.png" > < / a >
2019-10-20 16:46:52 +02:00
< img src = "/docs/images/space.png" width = 40 >
2020-10-09 14:52:33 +07:00
< a href = "/config/set/" > < img src = "/docs/images/symfony.png" > < / a >
2019-10-20 16:46:52 +02:00
< img src = "/docs/images/space.png" width = 40 >
2020-05-24 20:29:13 -04:00
< a href = "https://github.com/palantirnet/drupal-rector/tree/master/config/drupal-8" > < img src = "/docs/images/drupal.png" alt = "Drupal Rector rules" > < / a >
< img src = "/docs/images/space.png" width = 40 >
2020-10-09 14:52:33 +07:00
< a href = "/config/set/" > < img src = "/docs/images/cakephp.png" > < / a >
2017-10-30 16:00:28 +01:00
< / p >
2017-08-20 17:40:19 +02:00
2020-10-29 10:44:07 +01:00
### What Can Rector Do for You?
2018-08-01 22:29:01 +02:00
2020-06-17 12:12:34 +02:00
- [Upgrade 30 000 unit tests from PHPUnit 6 to 9 in 2 weeks ](https://twitter.com/LBajsarowicz/status/1272947900016967683 )
2020-08-24 23:25:26 +02:00
- [Complete PHP 7.4 property type declarations ](https://tomasvotruba.com/blog/2018/11/15/how-to-get-php-74-typed-properties-to-your-code-in-few-seconds/ )
- [Migrate your project from Nette to Symfony ](https://tomasvotruba.com/blog/2019/02/21/how-we-migrated-from-nette-to-symfony-in-3-weeks-part-1/ )
2020-10-29 10:44:07 +01:00
- [Refactor Laravel Facades to Dependency Injection ](https://tomasvotruba.com/blog/2019/03/04/how-to-turn-laravel-from-static-to-dependency-injection-in-one-day/ )
2017-12-28 17:58:35 -02:00
- And much more...
2017-07-15 19:20:20 +02:00
2020-08-24 23:25:26 +02:00
< br >
2019-11-08 18:02:29 +01:00
2020-10-29 10:44:07 +01:00
## Documentation
- [Explore 600+ Rector Rules ](/docs/rector_rules_overview.md )
- [How Does Rector Work? ](/docs/how_it_works.md )
- [PHP Parser Nodes Overview ](/docs/nodes_overview.md )
### Advanced
- [How To Run Rector on Changed Files Only ](/docs/how_to_run_rector_on_changed_files_only.md )
- [How to Ignore Rule or Paths ](/docs/how_to_ignore_rule_or_paths.md )
- [How to Configure Rule ](/docs/how_to_configure_rules.md )
2020-12-15 13:11:31 +01:00
- [How To Work with Doc Block and Comments ](/docs/how_to_work_with_doc_block_and_comments.md )
2020-10-29 10:44:07 +01:00
- [How run Rector in Docker ](/docs/how_to_run_rector_in_docker.md )
- [Add Checkstyle with your CI ](/docs/checkstyle.md )
2020-11-01 16:39:04 +01:00
### Contributing
- [How to Add Test for Rector Rule ](/docs/how_to_add_test_for_rector_rule.md )
- [How to Create New Rector Rule ](/docs/create_own_rule.md )
- [How to Generate New Rector Rule with Recipe ](/docs/rector_recipe.md )
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
```
2020-05-03 14:32:03 +02:00
- Having conflicts during `composer require` ? → Use the [Rector Prefixed ](https://github.com/rectorphp/rector-prefixed )
2020-10-29 10:44:07 +01:00
- Using a different PHP version than Rector supports? → Use the [Docker image ](/docs/how_to_run_rector_in_docker.md )
2018-01-06 16:50:22 +01:00
2020-08-24 23:25:26 +02:00
< br >
2019-11-08 17:49:03 +01:00
2020-08-24 23:25:26 +02:00
## Running Rector
2019-11-08 17:49:03 +01:00
2020-08-24 23:25:26 +02:00
There a 2 main ways to use Rector:
2019-11-08 17:49:03 +01:00
2020-10-29 10:44:07 +01:00
- a *single rule* , to have the change under control - you can choose [from over 600 rules ](/docs/rector_rules_overview.md )
2020-11-29 11:13:33 +01:00
- or group of rules called *sets* - [pick from sets ](/config/set )
2020-05-03 14:19:09 +02:00
2020-08-24 23:25:26 +02:00
To use them, create a `rector.php` in your root directory:
2020-07-18 20:26:57 +02:00
2020-10-29 10:44:07 +01:00
```bash
vendor/bin/rector init
```
And modify it:
2020-07-18 20:26:57 +02:00
```php
2020-07-20 14:18:15 +02:00
// rector.php
2020-07-18 20:26:57 +02:00
use Rector\Core\Configuration\Option;
2020-08-24 23:25:26 +02:00
use Rector\Php74\Rector\Property\TypedPropertyRector;
2020-07-20 14:18:15 +02:00
use Rector\Set\ValueObject\SetList;
2020-07-18 20:26:57 +02:00
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
2020-08-24 23:25:26 +02:00
// here we can define, what sets of rules will be applied
2020-10-29 10:44:07 +01:00
$parameters = $containerConfigurator->parameters();
2020-09-07 22:55:04 +07:00
$parameters->set(Option::SETS, [SetList::CODE_QUALITY]);
2020-07-29 18:28:19 +02:00
2020-08-24 23:25:26 +02:00
// register single rule
2020-10-29 10:44:07 +01:00
$services = $containerConfigurator->services();
2020-08-24 23:25:26 +02:00
$services->set(TypedPropertyRector::class);
};
```
2020-07-29 18:28:19 +02:00
2020-08-24 23:25:26 +02:00
< br >
2020-07-29 18:28:19 +02:00
2020-08-24 23:25:26 +02:00
Then dry run Rector:
2020-07-29 18:28:19 +02:00
2020-08-24 23:25:26 +02:00
```bash
vendor/bin/rector process src --dry-run
2020-05-03 14:19:09 +02:00
```
2019-11-08 17:49:03 +01:00
2020-08-24 23:25:26 +02: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
2020-05-03 14:19:09 +02:00
```bash
vendor/bin/rector process src
```
2020-07-29 18:28:19 +02:00
*Note: `rector.php` is loaded by default. For different location, use `--config` option.*
2019-11-08 17:49:03 +01:00
2020-08-24 23:25:26 +02:00
< br >
2020-05-13 18:17:21 +02:00
2020-10-29 10:44:07 +01:00
## Full Config Configuration
2020-05-13 18:17:21 +02:00
2020-07-29 18:28:19 +02:00
```php
// rector.php
use Rector\Core\Configuration\Option;
2020-11-26 23:09:21 +01:00
use Rector\Core\ValueObject\PhpVersion;
2020-07-29 18:28:19 +02:00
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$parameters = $containerConfigurator->parameters();
2020-08-24 23:25:26 +02:00
// paths to refactor; solid alternative to CLI arguments
2020-09-07 22:55:04 +07:00
$parameters->set(Option::PATHS, [__DIR__ . '/src', __DIR__ . '/tests']);
2020-07-29 18:28:19 +02:00
2020-08-24 23:25:26 +02:00
// 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',
2020-07-29 18:28:19 +02:00
]);
2020-11-26 23:09:21 +01:00
// is your PHP version different from the one your refactor to? [default: your PHP version], uses PHP_VERSION_ID format
2020-12-09 23:25:53 +01:00
$parameters->set(Option::PHP_VERSION_FEATURES, PhpVersion::PHP_72);
2020-08-24 23:25:26 +02:00
// auto import fully qualified class names? [default: false]
$parameters->set(Option::AUTO_IMPORT_NAMES, true);
2020-10-04 13:12:41 +02:00
2020-08-24 23:25:26 +02:00
// skip root namespace classes, like \DateTime or \Exception [default: true]
$parameters->set(Option::IMPORT_SHORT_CLASSES, false);
2020-10-04 13:12:41 +02:00
2020-08-24 23:25:26 +02:00
// skip classes used in PHP DocBlocks, like in /** @var \Some\Class */ [default: true]
$parameters->set(Option::IMPORT_DOC_BLOCKS, false);
2020-09-12 16:52:08 +07:00
2020-10-16 14:45:26 +07:00
// Run Rector only on changed files
$parameters->set(Option::ENABLE_CACHE, true);
2020-07-29 18:28:19 +02:00
};
2019-01-18 12:41:07 +01:00
```
2019-12-16 15:45:37 +01:00
### Symfony Container
To work with some Symfony rules, you now need to link your container XML file
2020-07-29 18:28:19 +02:00
```php
// rector.php
use Rector\Core\Configuration\Option;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$parameters = $containerConfigurator->parameters();
2020-09-07 22:55:04 +07:00
$parameters->set(
Option::SYMFONY_CONTAINER_XML_PATH_PARAMETER,
__DIR__ . '/var/cache/dev/AppKernelDevDebugContainer.xml'
);
2020-07-29 18:28:19 +02:00
};
2019-12-16 15:45:37 +01:00
```
2020-05-13 18:17:21 +02:00
< br >
2017-12-28 17:58:35 -02:00
## How to Contribute
2017-07-15 19:20:20 +02:00
2020-03-21 12:00:05 +01:00
See [the contribution guide ](/CONTRIBUTING.md ).
2018-12-12 10:02:10 +01:00
2020-05-13 18:17:21 +02:00
< br >
2020-10-29 10:44:07 +01:00
### Debugging
2019-03-11 16:27:13 +02:00
2020-10-29 10:44:07 +01:00
You can use `--debug` option, that will print nested exceptions output:
2019-03-11 16:27:13 +02:00
```bash
2020-10-29 10:44:07 +01:00
vendor/bin/rector process src/Controller --dry-run --debug
2019-03-11 16:27:13 +02:00
```
2019-04-02 15:40:53 +02:00
2020-11-02 17:50:07 -03:00
Or with Xdebug:
2020-07-07 17:58:55 +02:00
2020-11-02 17:50:07 -03:00
1. Make sure [Xdebug ](https://xdebug.org/ ) is installed and configured
2020-07-07 17:59:41 +02:00
2. Add `--xdebug` option when running Rector
2020-07-07 17:58:55 +02:00
2020-10-29 10:44:07 +01:00
```bash
vendor/bin/rector process src/Controller --dry-run --xdebug
```
2020-07-07 17:58:55 +02:00
2020-11-30 17:41:24 +01:00
To assist with echo-style debugging rector provides a `rd()` helper method which is usefull to pretty-print AST-nodes:
```php
/**
* @param Class_ $node
*/
public function refactor(Node $node): ?Node
{
rd($node);
die;
}
```
2020-07-07 17:58:55 +02:00
< br >
2020-05-13 18:17:21 +02:00
## Community Packages
2019-04-02 15:40:53 +02:00
2019-10-24 17:59:42 -07:00
Do you use Rector to upgrade your code? Add it here:
2019-04-02 15:40:53 +02:00
2020-04-17 17:13:29 -04:00
- [palantirnet/drupal-rector ](https://github.com/palantirnet/drupal-rector ) by [Palantir.net ](https://github.com/palantirnet ) for [Drupal ](https://www.drupal.org/ )
2019-10-24 18:04:18 -07:00
- [sabbelasichon/typo3-rector ](https://github.com/sabbelasichon/typo3-rector ) for [TYPO3 ](https://typo3.org/ )
2020-08-24 23:25:26 +02:00
## Known Drawbacks
### How to Apply Coding Standards?
2020-11-18 02:01:05 -08:00
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.
2020-08-24 23:25:26 +02:00
2020-11-18 02:01:05 -08:00
Don't have a coding standard tool? Add [ECS ](https://github.com/Symplify/EasyCodingStandard ) and use prepared [`ecs-after-rector.php` ](/ecs-after-rector.php ) set.