Instant Upgrades and Automated Refactoring of any PHP 5.3+ code
Go to file
2021-03-20 20:23:55 +01:00
.docker [Docker] Support multiple PHP versions for xdebug + blackfire images (#5760) 2021-03-03 18:48:43 +01:00
.github [Testing] Use single config-based testing to isolate scope unite testing for core + community packages (#5837) 2021-03-19 21:29:10 +01:00
bin [CI] Downgrade Rector to PHP 7.1 + prefix it (#5880) 2021-03-18 02:48:44 +01:00
build direct call in dependency 2021-03-18 20:56:21 +01:00
config remove PhpDocNodeTransformerInterface overly abstraction; merge AttributeAwarePhpDoc to BetterPhpDocParser (#5920) 2021-03-20 16:27:18 +01:00
docs [Doc] Documentation how to register custom SetList contant (#5921) 2021-03-20 14:10:13 +01:00
packages [PHPUnit] Decopule phpdoc tag nodes and factories (#5923) 2021-03-20 20:23:55 +01:00
packages-tests remove PhpDocNodeTransformerInterface overly abstraction; merge AttributeAwarePhpDoc to BetterPhpDocParser (#5920) 2021-03-20 16:27:18 +01:00
rules fix 2021-03-20 16:28:30 +01:00
rules-tests fix cs 2021-03-20 16:43:03 +01:00
src static 2021-03-20 19:51:32 +01:00
stubs [Testing] Use single config-based testing to isolate scope unite testing for core + community packages (#5837) 2021-03-19 21:29:10 +01:00
templates [RectorGenerator] Decouple to external package (#5825) 2021-03-12 20:13:27 +01:00
tests [Testing] Use single config-based testing to isolate scope unite testing for core + community packages (#5837) 2021-03-19 21:29:10 +01:00
utils [DX] Remove isInClassNamed() (#5914) 2021-03-20 01:37:33 +01:00
.dockerignore Build "scoped" Docker images in GitHub Actions (#5667) 2021-03-02 14:25:39 +01:00
.editorconfig cleanup 2020-04-03 13:24:44 +02:00
.gitattributes [Testing] Use single config-based testing to isolate scope unite testing for core + community packages (#5837) 2021-03-19 21:29:10 +01:00
.gitignore [CI] Downgrade Rector to PHP 7.1 + prefix it (#5880) 2021-03-18 02:48:44 +01:00
.phpstorm.meta.php remove FirstLevelNodeVisitor 2021-03-18 02:24:39 +01:00
CHANGELOG.md [CI] remove changelog linker (#5803) 2021-03-08 19:50:03 +00:00
CODE_OF_CONDUCT.md Use HTTPS instead of HTTP 2018-02-14 07:23:09 -02:00
composer.json composer: remove replace-self 2021-03-20 19:28:36 +01:00
CONTRIBUTING.md Move contributing guide to its own file 2020-03-21 14:22:10 +01:00
Dockerfile Drop no longer needed secured rector version of Docker image (#5759) 2021-03-03 17:37:59 +00:00
ecs.php [cs] apply on coding standard 2021-03-18 02:24:29 +01:00
full_build.sh [CI] Downgrade Rector to PHP 7.1 + prefix it (#5880) 2021-03-18 02:48:44 +01:00
LICENSE Update LICENSE year forever 2018-01-02 20:27:07 -02:00
phpstan-for-rector.neon [Nette] Decouple to own package (#5903) 2021-03-19 01:33:30 +01:00
phpstan.neon remove PhpDocNodeTransformerInterface overly abstraction; merge AttributeAwarePhpDoc to BetterPhpDocParser (#5920) 2021-03-20 16:27:18 +01:00
phpunit.xml [Testing] Use single config-based testing to isolate scope unite testing for core + community packages (#5837) 2021-03-19 21:29:10 +01:00
README.md Fix url to nodes-overview (#5695) 2021-02-28 10:36:32 +01:00
rector.php [PhpDocParser] Make use of native attributes (#5841) 2021-03-19 14:33:58 +00:00
rule-doc-generator.php [Docs] Improve rule doc generator to generat rules_overview with categories (#4688) 2020-11-25 21:34:34 +00:00
scoper.php typo 2021-03-18 23:30:47 +01:00
UPGRADE_09.md Fixed case sensitivity for SetList (#5345) 2021-01-28 16:48:39 +01: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 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 👍


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
  • Using a different PHP version than Rector supports? → Use the Docker image

Running Rector

There a 2 main ways to use Rector:

To use them, create a rector.php in your root directory:

vendor/bin/rector init

And modify it:

// rector.php
use Rector\Core\Configuration\Option;
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
    $parameters = $containerConfigurator->parameters();
    $parameters->set(Option::SETS, [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.


Full Config 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']);

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

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

    // auto import fully qualified class names? [default: false]
    $parameters->set(Option::AUTO_IMPORT_NAMES, true);

    // skip root namespace classes, like \DateTime or \Exception [default: true]
    $parameters->set(Option::IMPORT_SHORT_CLASSES, false);

    // skip classes used in PHP DocBlocks, like in /** @var \Some\Class */ [default: true]
    $parameters->set(Option::IMPORT_DOC_BLOCKS, false);

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

Symfony Container

To work with some Symfony rules, you now need to link your container XML file

// rector.php
use Rector\Core\Configuration\Option;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;

return static function (ContainerConfigurator $containerConfigurator): void {
    $parameters = $containerConfigurator->parameters();

    $parameters->set(
        Option::SYMFONY_CONTAINER_XML_PATH_PARAMETER,
        __DIR__ . '/var/cache/dev/AppKernelDevDebugContainer.xml'
    );
};

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 echo-style debugging rector provides a print_node() helper method which is useful to pretty-print AST-nodes:

/**
 * @param Class_ $node
 */
public function refactor(Node $node): ?Node
{
    print_node($node);
    die;
}

Community Packages

Do you use Rector to upgrade your code? Add it here:


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.