Home

Awesome

Rector Rules for Craft CMS

This package provides Rector rules for updating Craft CMS plugins and modules for:

Craft CMS 3 → 4

First, ensure Craft 3.7.35 or later is Composer-installed. (Prior versions of Craft weren’t compatible with Rector.)

composer update craftcms/cms 

Then run the following commands:

composer require php:^8.0.2 --ignore-platform-reqs
composer config minimum-stability dev
composer config prefer-stable true
composer require craftcms/rector:dev-main --dev --ignore-platform-reqs
vendor/bin/rector process src --config vendor/craftcms/rector/sets/craft-cms-40.php

If you have code that extends Craft Commerce classes, you can run the following command as well:

vendor/bin/rector process src --config vendor/craftcms/rector/sets/craft-commerce-40.php

Once Rector is complete, you’re ready to update craftcms/cms.

composer require craftcms/cms:^4.0.0-alpha -W --ignore-platform-reqs

Craft CMS 4 → 5

Run the following commands:

composer require php:^8.2 --ignore-platform-reqs
composer config minimum-stability dev
composer config prefer-stable true
composer require craftcms/rector:dev-main --dev --ignore-platform-reqs
vendor/bin/rector process src --config vendor/craftcms/rector/sets/craft-cms-50.php

Once Rector is complete, you’re ready to update craftcms/cms:

composer require craftcms/cms:^5.0.0-beta.1 -W --ignore-platform-reqs

Notes

Advanced Configuration

If you’d like to include additional Rector rules, or customize which files/directories should be processed, you’ll need to give your project a rector.php file.

Here’s an example which runs the Craft 4 rule set, but skips over a src/integrations/ folder:

<?php
declare(strict_types = 1);

use craft\rector\SetList as CraftSetList;
use Rector\Core\Configuration\Option;
use Rector\Config\RectorConfig;

return static function(RectorConfig $rectorConfig): void {
    // Skip the integrations folder
    $rectorConfig->skip([
        __DIR__ . '/src/integrations',
    ]);

    // Import the Craft 4 upgrade rule set
    $rectorConfig->sets([
        CraftSetList::CRAFT_CMS_40
    ]);
};