rector/README.md

233 lines
8.5 KiB
Markdown
Raw Normal View History

# Rector - Speedup Your PHP Development
2017-07-15 17:20:20 +00:00
[![Downloads](https://img.shields.io/packagist/dt/rector/rector.svg?style=flat-square)](https://packagist.org/packages/rector/rector)
<br>
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**.
<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.**
<br>
It's a tool that [we develop](https://getrector.org/) and share for free, so anyone can automate their refactoring.
2021-04-14 14:29:15 +00:00
[Hire us](https://getrector.org/contact) to speed up 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 16:51:41 +00:00
2020-02-21 14:26:02 +00:00
<br>
2019-04-29 21:42:11 +00:00
## Open-Source First
Rector **instantly upgrades and refactors the PHP code of your application**.
It supports all versions of PHP from 5.3 and major open-source projects:
2017-07-15 17:20:20 +00:00
2018-10-21 09:00:39 +00:00
<br>
2021-02-06 22:32:49 +00:00
<p align="center">
<img src="https://github.com/rectorphp/rector/blob/main/docs/images/php.png">
<img src="https://github.com/rectorphp/rector/blob/main/docs/images/space.png" width=30>
<a href="https://github.com/rectorphp/rector-phpunit"><img src="https://github.com/rectorphp/rector/blob/main/docs/images/phpunit.png"></a>
<img src="https://github.com/rectorphp/rector/blob/main/docs/images/space.png" width=30>
<a href="https://github.com/rectorphp/rector-symfony"><img src="https://github.com/rectorphp/rector/blob/main/docs/images/symfony.png"></a>
<img src="https://github.com/rectorphp/rector/blob/main/docs/images/space.png" width=30>
2021-02-06 22:40:09 +00:00
<a href="https://github.com/palantirnet/drupal-rector">
<img src="https://github.com/rectorphp/rector/blob/main/docs/images/drupal.png" alt="Drupal Rector rules">
2021-02-06 22:40:09 +00:00
</a>
<br>
<img src="https://github.com/rectorphp/rector/blob/main/docs/images/space.png" height=15>
<br>
<a href="https://github.com/rectorphp/rector-cakephp"><img src="https://github.com/rectorphp/rector/blob/main/docs/images/cakephp.png"></a>
<img src="https://github.com/rectorphp/rector/blob/main/docs/images/space.png" width=30>
<a href="https://github.com/sabbelasichon/typo3-rector">
<img src="https://github.com/rectorphp/rector/blob/main/docs/images/typo3.png">
</a>
2021-02-06 22:32:49 +00:00
<br>
<img src="https://github.com/rectorphp/rector/blob/main/docs/images/space.png" height=15>
2017-10-30 15:00:28 +00:00
</p>
2017-08-20 15:40:19 +00:00
### What Can Rector Do for You?
2018-08-01 20:29:01 +00:00
2020-12-26 11:13:17 +00:00
- [Complete 2800 `@var` types in 2 minutes](https://tomasvotruba.com/blog/2019/07/29/how-we-completed-thousands-of-missing-var-annotations-in-a-day/)
- [Upgrade 30 000 unit tests from PHPUnit 6 to 9](https://twitter.com/LBajsarowicz/status/1272947900016967683)
- [Complete PHP 7.4 Property Types](https://tomasvotruba.com/blog/2018/11/15/how-to-get-php-74-typed-properties-to-your-code-in-few-seconds/)
- [Migrate from Nette to Symfony](https://tomasvotruba.com/blog/2019/02/21/how-we-migrated-from-nette-to-symfony-in-3-weeks-part-1/)
- [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 19:58:35 +00:00
- And much more...
2017-07-15 17:20:20 +00:00
<br>
2019-11-08 17:02:29 +00:00
## Documentation
- [Explore 450+ Rector Rules](/docs/rector_rules_overview.md)
- [How Does Rector Work?](/docs/how_it_works.md)
- [PHP Parser Nodes](https://github.com/rectorphp/php-parser-nodes-docs/)
### Advanced
2021-04-25 09:43:24 +00:00
- [Auto Import Names](/docs/auto_import_names.md)
- [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)
- [How to Generate Configuration file](/docs/init_command.md)
### Contributing
- [How to add Test for Rector Rule](/docs/how_to_add_test_for_rector_rule.md)
- [How to work with Doc Block and Comments](/docs/how_to_work_with_doc_block_and_comments.md)
- [How to Create New Rector Rule](/docs/create_own_rule.md)
<br>
2017-07-15 17:20:20 +00:00
## Install
```bash
composer require rector/rector --dev
2017-07-15 17:20:20 +00:00
```
- Having conflicts during `composer require`? → Use the [Rector Prefixed](https://github.com/rectorphp/rector-prefixed) with PHP 7.1+ version
- Using a different PHP version than Rector supports? → Use the [Docker image](/docs/how_to_run_rector_in_docker.md)
<br>
2019-11-08 16:49:03 +00:00
## Running Rector
2019-11-08 16:49:03 +00:00
There a 2 main ways to use Rector:
2019-11-08 16:49:03 +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-07-18 18:26:57 +00:00
```bash
vendor/bin/rector init
```
And modify it:
2020-07-18 18:26:57 +00:00
```php
2020-07-20 12:18:15 +00:00
// rector.php
2020-07-18 18:26:57 +00:00
use Rector\Core\Configuration\Option;
use Rector\Php74\Rector\Property\TypedPropertyRector;
2020-07-20 12:18:15 +00:00
use Rector\Set\ValueObject\SetList;
2020-07-18 18:26:57 +00:00
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();
// tip: use "SetList" class to autocomplete sets
$parameters->set(Option::SETS, [SetList::CODE_QUALITY]);
// register single rule
$services = $containerConfigurator->services();
$services->set(TypedPropertyRector::class);
};
```
Then dry run Rector:
```bash
vendor/bin/rector process src --dry-run
```
2019-11-08 16:49:03 +00:00
Rector will show you diff of files that it *would* change. To *make* the changes, drop `--dry-run`:
2019-11-08 16:49:03 +00:00
```bash
vendor/bin/rector process src
```
*Note: `rector.php` is loaded by default. For different location, use `--config` option.*
2019-11-08 16:49:03 +00:00
<br>
2020-05-13 16:17:21 +00:00
## Configuration
2020-05-13 16:17:21 +00:00
```php
// rector.php
use Rector\Core\Configuration\Option;
2020-11-26 22:09:21 +00:00
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']);
2020-11-26 22:09:21 +00:00
// is your PHP version different from the one your refactor to? [default: your PHP version], uses PHP_VERSION_ID format
$parameters->set(Option::PHP_VERSION_FEATURES, PhpVersion::PHP_72);
// Run Rector only on changed files
$parameters->set(Option::ENABLE_CACHE, true);
// 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');
};
2019-01-18 11:41:07 +00:00
```
2020-05-13 16:17:21 +00:00
<br>
2017-12-28 19:58:35 +00:00
## How to Contribute
2017-07-15 17:20:20 +00:00
See [the contribution guide](/CONTRIBUTING.md).
2018-12-12 09:02:10 +00:00
2020-05-13 16:17:21 +00:00
<br>
### Debugging
You can use `--debug` option, that will print nested exceptions output:
```bash
vendor/bin/rector process src/Controller --dry-run --debug
```
2020-11-02 20:50:07 +00:00
Or with Xdebug:
2020-07-07 15:58:55 +00:00
2020-11-02 20:50:07 +00:00
1. Make sure [Xdebug](https://xdebug.org/) is installed and configured
2020-07-07 15:59:41 +00:00
2. Add `--xdebug` option when running Rector
2020-07-07 15:58:55 +00:00
```bash
vendor/bin/rector process src/Controller --dry-run --xdebug
```
2020-07-07 15:58:55 +00:00
2021-05-04 15:32:07 +00:00
To assist with simple debugging Rector provides a 2 helpers to pretty-print AST-nodes:
```php
2021-05-04 15:31:50 +00:00
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);
```
2020-07-07 15:58:55 +00:00
<br>
2020-05-13 16:17:21 +00:00
## Community Packages
Do you use Rector to upgrade your code? Add it here:
- [palantirnet/drupal-rector](https://github.com/palantirnet/drupal-rector) by [Palantir.net](https://github.com/palantirnet) for [Drupal](https://www.drupal.org/)
2019-10-25 01:04:18 +00:00
- [sabbelasichon/typo3-rector](https://github.com/sabbelasichon/typo3-rector) for [TYPO3](https://typo3.org/)
2021-02-15 21:40:45 +00:00
<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.
We're using [ECS](https://github.com/symplify/easy-coding-standard) with [this setup](ecs.php).