Instant Upgrades and Automated Refactoring of any PHP 5.3+ code
Go to file
Tomas Votruba 4c6da2c4bf
[Laravel 5.7] Add parent boot rule (#4580)
* move file to templates, to remove confusion in the root

* use stable symplify

* [Laravel] Add AddParentBootToModelClassMethodRector

* [ci-review] Generate Rector & Nodes documentation

* [ci-review] propagate monorepo dependencies

* [ci-review] Rector Rectify

Co-authored-by: rector-bot <tomas@getrector.org>
2020-11-11 17:09:57 +00:00
.docker/php Copy .git directory into docker image 2020-04-03 21:30:47 +02:00
.github [CI] try to fix ref on forks 2020-11-08 22:27:13 +00:00
bin [SymfonyPHPConfig] Add monorepo split for value objects function (#4153) 2020-10-10 17:42:43 +00:00
ci [DOC] Add more spaces between node code samples (#4271) 2020-09-22 15:46:02 +02:00
compiler Add regex uri to regex constant (#4504) 2020-10-29 19:04:33 +01:00
config [Laravel 5.7] Add parent boot rule (#4580) 2020-11-11 17:09:57 +00:00
docs [Laravel 5.7] Add parent boot rule (#4580) 2020-11-11 17:09:57 +00:00
packages [Laravel 5.7] Add parent boot rule (#4580) 2020-11-11 17:09:57 +00:00
patches [Nette] Add MoveFinalGetUserToCheckRequirementsClassMethodRector (#4520) 2020-10-31 00:43:54 +00:00
rules [Laravel 5.7] Add parent boot rule (#4580) 2020-11-11 17:09:57 +00:00
src [Laravel 5.7] Add parent boot rule (#4580) 2020-11-11 17:09:57 +00:00
stubs [Laravel 5.7] Add parent boot rule (#4580) 2020-11-11 17:09:57 +00:00
templates [Laravel 5.7] Add parent boot rule (#4580) 2020-11-11 17:09:57 +00:00
tests [BetterStandardPrinter] Fixes #3673 Doctrine Annotation comment should not be changed (#4577) 2020-11-11 16:14:31 +01:00
utils rector update 2020-11-05 02:01:47 +01:00
.dockerignore misc 2020-07-27 07:48:51 +02:00
.editorconfig cleanup 2020-04-03 13:24:44 +02:00
.gitattributes misc 2020-07-27 07:48:51 +02:00
.gitignore Fixes #3930 : TypedPropertyRector should not remove DocBlock comment when it specifies the values contained in an array (#4102) 2020-09-02 14:01:45 +02:00
.kodiak.toml kodiak: update branches with tagp 2020-10-26 01:41:07 +01:00
.phpstorm.meta.php Change file system approach of MultipleClassFileToPsr4ClassesRector to file without namespace node (#4522) 2020-10-31 12:59:40 +00:00
.travis.yml [ci] try split of monorepo packages 2020-11-04 00:43:23 +01:00
BACKERS.md [SOLID] Add ChangeIfElseValueAssignToEarlyReturnRector 2020-01-06 01:42:15 +01:00
changelog-linker.php change changelog linker from YAML to PHP 2020-10-02 19:15:40 +02:00
CHANGELOG.md [TypeDeclaration] Switch from stringy types to PHPStan types (#4510) 2020-10-30 11:58:35 +00:00
CODE_OF_CONDUCT.md Use HTTPS instead of HTTP 2018-02-14 07:23:09 -02:00
composer.json [Laravel 5.7] Add parent boot rule (#4580) 2020-11-11 17:09:57 +00:00
CONTRIBUTING.md Move contributing guide to its own file 2020-03-21 14:22:10 +01:00
Dockerfile [EarlyReturn] Decouple new set (#4490) 2020-10-27 13:47:37 +00:00
ecs-after-rector.php README + recipe improvements (#4017) 2020-08-24 21:25:26 +00:00
ecs.php [ci] remove old merageable file (#4497) 2020-10-28 23:26:17 +00:00
LICENSE Update LICENSE year forever 2018-01-02 20:27:07 -02:00
monorepo-builder.php restore origina monorepo builder split 2020-10-19 17:39:16 +02:00
phpstan.neon [BetterStandardPrinter] Fixes #4274 #4573 Annotation callback and Route values should not be changed (#4576) 2020-11-11 13:06:46 +00:00
phpunit.xml reactivate coverage report (#4405) 2020-10-14 18:07:59 +02:00
README.md Fix Xdebug spelling (#4546) 2020-11-02 21:50:07 +01:00
rector-ci.php [CodeQualityStrict] Enable MoveOutMethodCallInsideIfConditionRector (#4502) 2020-10-29 21:47:12 +01:00
rector-recipe.php.dist [TypeDeclaration] Switch from stringy types to PHPStan types (#4510) 2020-10-30 11:58:35 +00:00
rector.php add ActiveRectorsProvider, fix reporting 0 rules registered (#4106) 2020-09-02 12:54:11 +00:00
sonar-project.properties [SOLID] Add MoveVariableDeclarationNearReferenceRector (#4410) 2020-10-30 13:25:24 +00:00

Rector - Speedup Your PHP Development

Coverage Status Downloads SonarCube


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 you 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 you can enjoy the 300 % development speed 👍


Show Case: Complete 2700 @var annotations in 2 mins

Rector-showcase

How does this work?


Open-Source First

Rector instantly upgrades and refactors the PHP code of your application. It supports all versions of PHP from 5.2 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:

  • a single rule, to have the change under control - you can choose from over 600 rules
  • or group of rules called sets - pick from sets

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

vendor/bin/rector init

And modify it:

<?php

// rector.php

declare(strict_types=1);

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

<?php

// rector.php

declare(strict_types=1);

use Rector\Core\Configuration\Option;
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]
    $parameters->set(Option::PHP_VERSION_FEATURES, '7.2');

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

Symfony Container

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

<?php

// rector.php

declare(strict_types=1);

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

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, that build on technology called abstract syntax tree (AST). AST doesn't care about spaces and produces mall-formatted code in both PHP and docblock annotations. That's why your project needs to have coding standard tool and set of rules, so it can make refactored nice and shiny again.

Don't have any coding standard tool? Add ECS and use prepared ecs-after-rector.php set.