rector/README.md

384 lines
8.9 KiB
Markdown
Raw Normal View History

2017-11-12 19:13:59 +00:00
# Rector Reconstructs your Legacy Code to Modern Codebase
2017-07-15 17:20:20 +00:00
2017-11-13 01:58:21 +00:00
[![Build Status](https://img.shields.io/travis/rectorphp/rector/master.svg?style=flat-square)](https://travis-ci.org/rectorphp/rector)
2017-11-13 14:31:35 +00:00
[![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 17:20:20 +00:00
2017-10-30 15:08:28 +00:00
Rector **upgrades your application** for you, with focus on open-source projects:
2017-07-15 17:20:20 +00:00
2017-10-30 15:00:28 +00:00
<p align="center">
2017-11-21 10:48:32 +00:00
<a href="/src/config/level/symfony"><img src="/docs/images/symfony.png"></a>
2017-12-10 01:52:28 +00:00
<img src="/docs/images/space.png" width=20>
2017-11-21 10:48:32 +00:00
<a href="/src/config/level/nette"><img src="/docs/images/nette.png" height="50"></a>
2017-12-10 01:52:28 +00:00
<img src="/docs/images/space.png" width=20>
2017-11-21 10:48:32 +00:00
<a href="/src/config/level/phpunit"><img src="/docs/images/phpunit.jpg"></a>
2017-12-10 01:52:28 +00:00
<img src="/docs/images/space.png" width=20>
2017-11-21 10:48:32 +00:00
<a href="/src/config/level/roave"><img src="/docs/images/roave.png"></a>
2017-12-10 01:52:28 +00:00
<img src="/docs/images/space.png" width=20>
2017-12-02 20:59:03 +00:00
<a href="/src/config/level/twig"><img src="/docs/images/twig.png"></a>
2017-10-30 15:00:28 +00:00
</p>
2017-08-20 15:40:19 +00:00
2017-10-30 15:08:28 +00:00
<br>
2017-07-15 17:20:20 +00:00
## Install
```bash
2017-12-10 02:14:41 +00:00
composer require --dev rector/rector @dev nikic/php-parser '4.0.x-dev'
2017-07-15 17:20:20 +00:00
```
Do you have old PHP or dependencies in conflict? Ok, [it is not problem](/docs/HowUseWithOldPhp.md).
2017-10-30 13:33:09 +00:00
## How To Reconstruct your Code?
### A. Prepared Sets
2017-12-02 21:03:10 +00:00
Featured open-source projects have **prepared sets**. You'll find them in [`/src/config/level`](/src/config/level).
2017-10-30 13:33:09 +00:00
E.g. Do you need to upgrade to Symfony 3.3?
2017-10-30 13:33:09 +00:00
1. Run rector on your `/src` directory
2017-10-30 13:33:09 +00:00
```bash
vendor/bin/rector process src --level symfony33
```
2017-10-30 13:33:09 +00:00
Which is just a shortcut for using complete path with `--config` option:
```bash
vendor/bin/rector process src --config vendor/rector/rector/src/config/level/symfony/symfony33.yml
```
You can also use your own config file:
2017-10-30 13:33:09 +00:00
```bash
vendor/bin/rector process src --config your-own-config.yml
```
2017-10-30 13:33:09 +00:00
2. Check the Git
```
2017-10-30 13:33:09 +00:00
git diff
```
2017-10-30 13:33:09 +00:00
### B. Custom Sets
2017-09-27 21:58:14 +00:00
1. Create `rector.yml` with desired Rectors
```yml
rectors:
- Rector\Rector\Contrib\Nette\Application\InjectPropertyRector
2017-09-27 21:58:14 +00:00
```
2. Run rector on your `/src` directory
2017-07-15 17:20:20 +00:00
```bash
2017-09-27 21:58:14 +00:00
vendor/bin/rector process src
```
3. Check the Git
```
git diff
2017-07-15 17:20:20 +00:00
```
2017-08-21 10:12:51 +00:00
### Simple 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 20:34:30 +00:00
- **replace part of namespace**
```yml
# better-reflection20.yml
rectors:
Rector\Rector\Dynamic\NamespaceReplacerRector:
2017-11-01 16:41:13 +00:00
# old namespace: new namespace
2017-10-07 20:34:30 +00:00
'BetterReflection': 'Roave\BetterReflection'
```
- **change method name**
```yml
rectors:
Rector\Rector\Dynamic\MethodNameReplacerRector:
2017-11-01 16:41:13 +00:00
# class
'Nette\Utils\Html':
2017-11-01 16:41:13 +00:00
# old method: new method
'add': 'addHtml'
2017-10-30 13:33:09 +00:00
2017-10-20 16:04:52 +00:00
# or in case of static methods calls
2017-10-30 13:33:09 +00:00
2017-11-01 16:41:13 +00:00
# class
2017-10-20 16:04:52 +00:00
'Nette\Bridges\FormsLatte\FormMacros':
2017-11-01 16:41:13 +00:00
# old method: [new class, new method]
2017-10-20 16:04:52 +00:00
'renderFormBegin': ['Nette\Bridges\FormsLatte\Runtime', 'renderFormBegin']
```
2017-10-21 22:04:15 +00:00
- **change property name**
```yml
rectors:
Rector\Rector\Dynamic\PropertyNameReplacerRector:
# class:
'PhpParser\Node\Param':
2017-11-18 15:19:47 +00:00
# old property: new property
2017-10-21 22:04:15 +00:00
'name': 'var'
```
2017-10-20 18:35:04 +00:00
- **change class constant name**
```yml
rectors:
Rector\Rector\Dynamic\ClassConstantReplacerRector:
2017-11-01 16:41:13 +00:00
# class
2017-10-20 18:35:04 +00:00
'Symfony\Component\Form\FormEvents':
2017-11-01 16:41:13 +00:00
# old constant: new constant
2017-10-20 18:35:04 +00:00
'PRE_BIND': 'PRE_SUBMIT'
'BIND': 'SUBMIT'
'POST_BIND': 'POST_SUBMIT'
```
2017-10-22 14:51:13 +00:00
- **change parameters typehint according to parent type**
```yml
rectors:
Rector\Rector\Dynamic\ParentTypehintedArgumentRector:
2017-11-01 16:41:13 +00:00
# class
'PhpParser\Parser':
2017-11-01 16:41:13 +00:00
# method
'parse':
2017-11-01 16:41:13 +00:00
# parameter: typehint
'code': 'string'
```
2017-11-01 16:42:08 +00:00
- **change argument value**
2017-11-01 12:07:59 +00:00
```yml
2017-11-01 16:41:13 +00:00
rectors:
Rector\Rector\Dynamic\ArgumentReplacerRector:
# class
'Symfony\Component\DependencyInjection\ContainerBuilder':
# method
'compile':
# argument position
0:
# added default value
'~': false
2017-11-01 17:42:47 +00:00
# or remove completely
'~': ~
2017-11-01 17:42:47 +00:00
# or replace by new value
'Symfony\Component\DependencyInjection\ContainerBuilder\ContainerBuilder::SCOPE_PROTOTYPE': false
2017-11-01 12:07:59 +00:00
```
2017-10-30 13:33:09 +00:00
- or **replace underscore naming `_` with namespaces `\`**
```yml
rectors:
2017-12-02 19:23:55 +00:00
Rector\Rector\Dynamic\PseudoNamespaceToNamespaceRector:
# old namespace prefix
- 'PHPUnit_'
# exclude classes
- '!PHPUnit_Framework_MockObject_MockObject'
```
2017-11-18 15:51:57 +00:00
- or **change property to method**
```yml
rectors:
Rector\Rector\Dynamic\PropertyToMethodRector:
# type
'Symfony\Component\Translation\Translator':
# property to replace
'locale':
# (prepared key): get method name
'get': 'getLocale'
# (prepared key): set method name
'set': 'setLocale'
```
2017-11-23 16:04:36 +00:00
- or **remove value object and use simple types**
```yml
rectors:
Rector\Rector\Dynamic\ValueObjectRemoverRector:
2017-11-23 16:04:36 +00:00
# type: new simple type
'ValueObjects\Name': 'string'
```
For example:
```php
2017-11-23 16:04:36 +00:00
$value = new ValueObjects\Name('Tomas');
# to
2017-11-23 16:04:36 +00:00
$value = 'Tomas';
```
2017-11-23 16:04:36 +00:00
```php
/**
* @var ValueObjects\Name
*/
private $name;
# to
/**
* @var string
*/
private $name;
```
```php
public function someMethod(ValueObjects\Name $name) { ...
# to
public function someMethod(string $name) { ...
```
2017-11-18 15:51:57 +00:00
### Turn Magic to Methods
- **replace get/set magic methods with real ones**
```yml
rectors:
Rector\Rector\MagicDisclosure\GetAndSetToMethodCallRector:
# class
'Nette\DI\Container':
# magic method (prepared keys): new real method
'get': 'getService'
'set': 'addService'
```
2017-11-18 14:03:38 +00:00
For example:
```php
$result = $container['key'];
2017-11-23 16:04:36 +00:00
2017-11-18 14:03:38 +00:00
# to
2017-11-23 16:04:36 +00:00
2017-11-18 14:03:38 +00:00
$result = $container->getService('key');
2017-11-23 16:04:36 +00:00
```
2017-11-23 16:04:36 +00:00
```php
$container['key'] = $value;
2017-11-23 16:04:36 +00:00
2017-11-18 14:03:38 +00:00
# to
2017-11-23 16:04:36 +00:00
$container->addService('key', $value);
```
- or **replaces isset/unset magic methods with real ones**
```yml
rectors:
Rector\Rector\MagicDisclosure\UnsetAndIssetToMethodCallRector:
# class
'Nette\DI\Container':
# magic method (prepared keys): new real method
'isset': 'hasService'
'unset': 'removeService'
```
2017-11-18 14:03:38 +00:00
For example:
```php
isset($container['key']);
2017-11-23 16:04:36 +00:00
2017-11-18 14:03:38 +00:00
# to
2017-11-23 16:04:36 +00:00
$container->hasService('key');
```
```php
2017-11-18 14:03:38 +00:00
unset($container['key']);
2017-11-23 16:04:36 +00:00
2017-11-18 14:03:38 +00:00
# to
2017-11-23 16:04:36 +00:00
$container->removeService('key');
```
2017-11-18 14:42:15 +00:00
- or **replaces toString magic methods with real ones**
```yml
rectors:
Rector\Rector\MagicDisclosure\ToStringToMethodCallRector:
# class
'Symfony\Component\Config\ConfigCache':
# magic method (prepared key): new real method
'toString': 'getPath'
```
For example:
```php
$result = (string) $someValue;
2017-11-23 16:04:36 +00:00
2017-11-18 14:42:15 +00:00
# to
2017-11-23 16:04:36 +00:00
2017-11-18 14:42:15 +00:00
$result = $someValue->someMethod();
2017-11-23 16:04:36 +00:00
```
```php
2017-11-18 14:42:15 +00:00
$result = $someValue->__toString();
2017-11-23 16:04:36 +00:00
2017-11-18 14:42:15 +00:00
# to
2017-11-23 16:04:36 +00:00
2017-11-18 14:42:15 +00:00
$result = $someValue->someMethod();
```
2017-11-02 17:31:57 +00:00
### Coding Standards are Outsourced
2017-11-05 22:07:32 +00:00
This package has no intention in formatting your code, as **coding standard tools handle this much better**.
2017-11-02 17:31:57 +00:00
2017-11-18 15:19:47 +00:00
We prefer [EasyCodingStandard](https://github.com/Symplify/EasyCodingStandard) that is already available:
2017-11-02 17:31:57 +00:00
2017-11-18 15:19:47 +00:00
```bash
2017-11-02 17:31:57 +00:00
# check
vendor/bin/ecs check --config vendor/rector/rector/ecs-after-rector.neon
2017-11-18 15:19:47 +00:00
2017-11-02 17:31:57 +00:00
# fix
vendor/bin/ecs check --config vendor/rector/rector/ecs-after-rector.neon --fix
```
2017-11-18 15:19:47 +00:00
### More Detailed Documentation
2017-10-15 09:07:53 +00:00
2017-11-18 15:19:47 +00:00
- [How to Create Own Rector](/docs/HowToCreateOwnRector.md)
2017-10-15 09:07:53 +00:00
- [Service Name to Type Provider](/docs/ServiceNameToTypeProvider.md)
2017-07-15 17:20:20 +00:00
### How to Contribute
Just follow 3 rules:
- **1 feature per pull-request**
2017-08-21 10:12:51 +00:00
- **New feature needs tests**
2017-07-15 17:20:20 +00:00
- Tests, coding standard and PHPStan **checks must pass**
```bash
composer all
```
2017-08-21 10:12:51 +00:00
Don you need to fix coding standards? Run:
2017-07-15 17:20:20 +00:00
```bash
2017-08-21 10:12:51 +00:00
composer fix-cs
2017-07-15 17:20:20 +00:00
```
We would be happy to merge your feature then.