Instant Upgrades and Automated Refactoring of any PHP 5.3+ code
Go to file
2021-05-09 21:24:57 +02:00
.github [CI] build split into rectorphp/rector 2021-05-09 20:03:49 +02:00
bin [scoped on PHP 7.0] bin/rector run with extracted phpstan (#6371) 2021-05-06 23:43:45 +02:00
build bump rector-prefixed names to rector 2021-05-09 21:13:45 +02:00
config [DowngradePhp70] Add DowngradeGeneratedScalarTypesRector (#6392) 2021-05-08 15:14:35 +02:00
docs [automated] Re-Generate Nodes/Rectors Documentation (#6396) 2021-05-09 02:15:50 +02:00
packages add RectorOutputStyle to out-scope output formatter from symfony (#6395) 2021-05-08 23:04:43 +02:00
packages-tests [TASK] Take .editorconfig into account (#6272) 2021-05-06 13:26:28 +02:00
rules add changelog link 2021-05-08 23:36:55 +02:00
rules-tests skip type without PHP declaration 2021-05-08 21:20:03 +02:00
src make node_helper.php safe for similar names 2021-05-09 21:24:57 +02:00
stubs fix stub loading 2021-05-06 16:11:59 +02:00
templates Move from SETS parameter to explicit import() (#6375) 2021-05-06 20:06:31 +00:00
tests do not prefix SymfonyStyle, to keep often-used class untouched 2021-05-08 22:53:51 +02:00
upgrade Add setter/getter factory (#6219) 2021-04-23 18:14:51 +00:00
utils do not prefix SymfonyStyle, to keep often-used class untouched 2021-05-08 22:53:51 +02:00
.editorconfig cleanup 2020-04-03 13:24:44 +02:00
.gitattributes [TASK] Take .editorconfig into account (#6272) 2021-05-06 13:26:28 +02:00
.gitignore [CI] Downgrade Rector to PHP 7.1 + prefix it (#5880) 2021-03-18 02:48:44 +01:00
.phpstorm.meta.php Make use of File object instead of passing around provider of file info, tokens, stmts etc. (#6110) 2021-04-13 00:12:48 +00:00
CHANGELOG.md [DeadCode] Remove duplicated RemoveUnusedPrivateConstantRector (#6151) 2021-04-15 23:38:44 +02:00
CODE_OF_CONDUCT.md Use HTTPS instead of HTTP 2018-02-14 07:23:09 -02:00
composer.json composer: drop replace 2021-05-09 21:17:49 +02:00
CONTRIBUTING.md Move contributing guide to its own file 2020-03-21 14:22:10 +01:00
ecs.php Move from SETS parameter to explicit import() (#6375) 2021-05-06 20:06:31 +00:00
full_build.sh use portable shebang 2021-04-22 21:12:02 +02:00
LICENSE Update LICENSE year forever 2018-01-02 20:27:07 -02:00
phpstan-for-rector.neon Decouple Rector PHPStan rules to own package (#6242) 2021-04-25 23:12:14 +00:00
phpstan.neon [scoped on PHP 7.0] bin/rector run with extracted phpstan (#6371) 2021-05-06 23:43:45 +02:00
phpunit.xml phpunit: run defect first 2021-04-25 15:46:45 +02:00
preload.php refresh preload 2021-05-07 18:01:17 +02:00
README.md README: packages are already included in logos, remove them and keep once 2021-05-08 02:09:21 +02:00
rector-testing.php [Downgrade PHP 7.2] Make covariant change local methods only (#6218) 2021-04-23 17:54:30 +00:00
rector.php [scoped on PHP 7.0] bin/rector run with extracted phpstan (#6371) 2021-05-06 23:43:45 +02:00
rule-doc-generator.php Add setter/getter factory (#6219) 2021-04-23 18:14:51 +00:00
scoper-php70.php [Scoped] Add more paths to scope (#6382) 2021-05-07 14:02:04 +00:00
scoper.php bump rector-prefixed names to rector 2021-05-09 21:13:45 +02:00
UPGRADE.md Add upgrade path to Rector 0.10 - upgrade set included (#6061) 2021-04-09 01:12:42 +00:00

Rector - Speedup Your PHP Development

Downloads


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.

  • 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 after each commit.

It's a tool that we develop and share for free, so anyone can automate their refactoring.

Hire us 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 👍


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:


Drupal Rector rules


What Can Rector Do for You?


Documentation

Advanced

Contributing


Install

composer require rector/rector --dev
  • Having conflicts during composer require? → Use the Rector Prefixed with PHP 7.1+ version
  • Using a different PHP version than Rector supports? → Use the Docker image

Running Rector

There a 2 main ways to use Rector:

  • 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:

vendor/bin/rector init

And modify it:

// rector.php
use Rector\Php74\Rector\Property\TypedPropertyRector;
use Rector\Set\ValueObject\SetList;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;

return static function (ContainerConfigurator $containerConfigurator): void {
    // here we can define, what sets of rules will be applied
    // tip: use "SetList" class to autocomplete sets
    $containerConfigurator->import(SetList::CODE_QUALITY);

    // register single rule
    $services = $containerConfigurator->services();
    $services->set(TypedPropertyRector::class);
};

Then dry run Rector:

vendor/bin/rector process src --dry-run

Rector will show you diff of files that it would change. To make the changes, drop --dry-run:

vendor/bin/rector process src

Note: rector.php is loaded by default. For different location, use --config option.


Configuration

// rector.php
use Rector\Core\Configuration\Option;
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']);

    // 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');
};

How to Contribute

See the contribution guide.


Debugging

You can use --debug option, that will print nested exceptions output:

vendor/bin/rector process src/Controller --dry-run --debug

Or with Xdebug:

  1. Make sure Xdebug is installed and configured
  2. Add --xdebug option when running Rector
vendor/bin/rector process src/Controller --dry-run --xdebug

To assist with simple debugging Rector provides a 2 helpers to pretty-print AST-nodes:

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);

Known Drawbacks

How to Apply Coding Standards?

Rector uses 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 with this setup.