rector/README.md

244 lines
5.7 KiB
Markdown
Raw Normal View History

2017-07-15 19:20:20 +02:00
# Rector - Reconstruct your Legacy Code to Modern Codebase
2017-09-21 12:40:27 +02:00
[![Build Status](https://img.shields.io/travis/RectorPHP/Rector/master.svg?style=flat-square)](https://travis-ci.org/RectorPHP/Rector)
[![Coverage Status](https://img.shields.io/coveralls/RectorPHP/Rector/master.svg?style=flat-square)](https://coveralls.io/github/RectorPHP/Rector?branch=master)
2017-07-15 19:20:20 +02:00
2017-09-06 19:37:07 +02:00
This tool will **upgrade your application** for you.
2017-07-15 19:20:20 +02:00
## All Reconstructors
2017-09-09 20:44:44 +02:00
At the moment these packages are supported:
2017-10-12 17:31:55 +02:00
- [Nette](/src/config/level/nette)
- [PHP_CodeSniffer](/src/config/level/php-code-sniffer)
- [PHPUnit](/src/config/level/phpunit)
- [Roave](/src/config/level/roave)
- [Symfony](/src/config/level/symfony)
2017-08-20 17:40:19 +02:00
2017-07-15 19:20:20 +02:00
## Install
```bash
composer require rector/rector --dev
```
2017-10-24 00:18:47 +02:00
### On PHP < 7.1
You must have separated environment with PHP 7.1 (for example in Docker container). When you have it then run following command.
```
composer create-project rector/rector your-path-to-rector
```
When do you have it then you can run all commands like
```
your-path-to-rector/bin/rector process /var/www/old-project --config=your-path-to-rector/src/config/level/nette/nette24.yml
your-path-to-rector/bin/rector process /var/www/another-old-project --config=your-path-to-rector/src/config/level/symfony/symfony40.yml
```
2017-09-27 23:58:14 +02:00
## How To Reconstruct your Code?
1. Create `rector.yml` with desired Rectors
```yml
rectors:
- Rector\Rector\Contrib\Nette\Application\InjectPropertyRector
2017-09-27 23:58:14 +02:00
```
2. Run rector on your `/src` directory
2017-07-15 19:20:20 +02:00
```bash
2017-09-27 23:58:14 +02:00
vendor/bin/rector process src
```
3. Check the Git
```
git diff
2017-07-15 19:20:20 +02:00
```
2017-08-21 12:12:51 +02:00
2017-09-09 20:44:44 +02:00
### 6 Steps to Add New Rector
2017-08-21 12:12:51 +02:00
Just extend `Rector\Rector\AbstractRector`.
2017-09-09 20:44:44 +02:00
It will prepare **2 methods** processing the node.
2017-08-21 12:12:51 +02:00
```php
public function isCandidate(Node $node): bool
{
}
public function refactor(Node $node): ?Node
{
}
```
2. Put it under `namespace Rector\Contrib\<set>;` namespace
```php
<?php declare(strict_types=1);
namespace Rector\Contrib\Symfony;
use Rector\Rector\AbstractRector;
final class MyRector extends AbstractRector
{
// ...
}
```
3. Add a Test Case
2017-09-09 20:44:44 +02:00
4. Add to specific level, e.g. [`/src/config/level/nette/nette24.yml`](/src/config/level/nette/nette24.yml)
5. Submit PR
2017-08-21 12:12:51 +02:00
2017-09-15 00:12:30 +02:00
6. :+1:
2017-08-21 12:12:51 +02:00
### Simpler setup with Dynamic Rectors
You don't have to always write PHP code. Many projects change only classes or method names, so it would be too much work for a simple task.
Instead you can use prepared **Dynamic Rectors** directly in `*.yml` config:
You can:
- **replace class name**
```yml
# phpunit60.yml
rectors:
Rector\Rector\Dynamic\ClassReplacerRector:
# old class: new class
'PHPUnit_Framework_TestCase': 'PHPUnit\Framework\TestCase'
```
2017-10-07 22:34:30 +02:00
- **replace part of namespace**
```yml
# better-reflection20.yml
rectors:
Rector\Rector\Dynamic\NamespaceReplacerRector:
'BetterReflection': 'Roave\BetterReflection'
```
- **change method name**
```yml
# nette24.yml
rectors:
Rector\Rector\Dynamic\MethodNameReplacerRector:
# class:
2017-10-20 18:04:52 +02:00
# old method: new method
'Nette\Utils\Html':
'add': 'addHtml'
2017-10-20 18:04:52 +02:00
# or in case of static methods calls
# class:
# old method: [new class, new method]
'Nette\Bridges\FormsLatte\FormMacros':
'renderFormBegin': ['Nette\Bridges\FormsLatte\Runtime', 'renderFormBegin']
```
2017-10-22 00:04:15 +02:00
- **change property name**
```yml
# php-parser40.yml
rectors:
Rector\Rector\Dynamic\PropertyNameReplacerRector:
# class:
# old property: new property
'PhpParser\Node\Param':
'name': 'var'
```
2017-10-20 20:35:04 +02:00
- **change class constant name**
```yml
# symfony30.yml
rectors:
Rector\Rector\Dynamic\ClassConstantReplacerRector:
# class:
# OLD_CONSTANT: NEW_CONSTANT
'Symfony\Component\Form\FormEvents':
'PRE_BIND': 'PRE_SUBMIT'
'BIND': 'SUBMIT'
'POST_BIND': 'POST_SUBMIT'
```
2017-10-22 16:51:13 +02:00
- **change parameters typehint according to parent type**
```yml
# php-parser40.yml
rectors:
Rector\Rector\Dynamic\ParentTypehintedArgumentRector:
# class:
# method:
# parameter: typehting
'PhpParser\Parser':
'parse':
'code': 'string'
```
2017-10-29 22:12:30 +01:00
- **remove unused arguments**
```yml
Rector\Rector\Dynamic\ArgumentRemoverRector:
# class
# method
# arguments to remove
'Doctrine\ORM\Persisters\Entity\AbstractEntityInheritancePersister':
'getSelectJoinColumnSQL':
- 'className'
```
- or **replace underscore naming `_` with namespaces `\`**
```yml
rectors:
Rector\Roector\Dynamic\PseudoNamespaceToNamespaceRector:
# old namespace prefix
- 'PHPUnit_'
```
2017-09-28 17:15:40 +02:00
### READMEs for Subpackages
2017-10-16 18:03:11 +02:00
- [BetterReflection](/packages/BetterReflection/README.md)
2017-09-28 17:15:40 +02:00
- [DeprecationExtractor](/packages/DeprecationExtractor/README.md)
- [NodeTraverserQueue](/packages/NodeTraverserQueue/README.md)
- [NodeTypeResolver](/packages/NodeTypeResolver/README.md)
- [NodeValueResolver](/packages/NodeValueResolver/README.md)
2017-10-25 16:35:45 +02:00
- [ReflectionDocBlock](/packages/ReflectionDocBlock/README.md)
2017-08-21 12:12:51 +02:00
2017-10-15 11:07:53 +02:00
### Advanced Operations
- [Service Name to Type Provider](/docs/ServiceNameToTypeProvider.md)
2017-07-15 19:20:20 +02:00
### How to Contribute
Just follow 3 rules:
- **1 feature per pull-request**
2017-08-21 12:12:51 +02:00
- **New feature needs tests**
2017-07-15 19:20:20 +02:00
- Tests, coding standard and PHPStan **checks must pass**
```bash
composer all
```
2017-08-21 12:12:51 +02:00
Don you need to fix coding standards? Run:
2017-07-15 19:20:20 +02:00
```bash
2017-08-21 12:12:51 +02:00
composer fix-cs
2017-07-15 19:20:20 +02:00
```
We would be happy to merge your feature then.