PHP code example of zero-to-prod / laravel-rector

1. Go to this page and download the library: Download zero-to-prod/laravel-rector library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

zero-to-prod / laravel-rector example snippets


use Rector\Config\RectorConfig;
use ZeroToProd\LaravelRector\Rector\AddReadonlyToClassWithTraitRector;
use ZeroToProd\LaravelRector\Rector\AddTypeToConstOnReadonlyClassRector;
use ZeroToProd\LaravelRector\Rector\CollapseSingleLineDocblockRector;
use ZeroToProd\LaravelRector\Rector\EnforceControllerSuffixRector;
use ZeroToProd\LaravelRector\Rector\EnforceInvokableControllerRector;
use ZeroToProd\LaravelRector\Rector\EnforceInvokableControllerRouteRector;
use ZeroToProd\LaravelRector\Rector\EnforceRegisteredClassRector;
use ZeroToProd\LaravelRector\Rector\ForbidAttributedClassDependencyRector;
use ZeroToProd\LaravelRector\Rector\ForbidBladeAttributeValueRector;
use ZeroToProd\LaravelRector\Rector\ForbidClassDependencyRector;
use ZeroToProd\LaravelRector\Rector\ForbidClassUsageRector;
use ZeroToProd\LaravelRector\Rector\ForbidCommentPhraseRector;
use ZeroToProd\LaravelRector\Rector\ForbidDuplicateBladeElementRector;
use ZeroToProd\LaravelRector\Rector\ForbidKeywordUsageRector;
use ZeroToProd\LaravelRector\Rector\ForbidNamespaceDependencyRector;
use ZeroToProd\LaravelRector\Rector\RenameParamToMatchTypeExactCaseRector;

return RectorConfig::configure()
    ->withPaths([
        __DIR__.'/app',
        __DIR__.'/routes',
        __DIR__.'/tests',
    ])
    ->withRules([
        AddReadonlyToClassWithTraitRector::class,
        AddTypeToConstOnReadonlyClassRector::class,
        CollapseSingleLineDocblockRector::class,
        EnforceControllerSuffixRector::class,
        EnforceInvokableControllerRector::class,
        EnforceInvokableControllerRouteRector::class,
        EnforceRegisteredClassRector::class,
        ForbidAttributedClassDependencyRector::class,
        ForbidBladeAttributeValueRector::class,
        ForbidClassDependencyRector::class,
        ForbidClassUsageRector::class,
        ForbidCommentPhraseRector::class,
        ForbidDuplicateBladeElementRector::class,
        ForbidKeywordUsageRector::class,
        ForbidNamespaceDependencyRector::class,
        RenameParamToMatchTypeExactCaseRector::class,
    ]);

->withConfiguredRule(AddReadonlyToClassWithTraitRector::class, [
    'traits' => [
        'App\\Helpers\\DataModel',
    ],
])

->withConfiguredRule(AddReadonlyToClassWithTraitRector::class, [
    'traits' => [
        'App\\Helpers\\DataModel',
    ],
    'leave_todo' => true,
])

->withConfiguredRule(AddTypeToConstOnReadonlyClassRector::class, [
    'leave_todo' => true,
])

->withConfiguredRule(CollapseSingleLineDocblockRector::class, [
    'leave_todo' => true,
])

->withConfiguredRule(EnforceControllerSuffixRector::class, [
    'leave_todo' => true,
])

->withConfiguredRule(EnforceInvokableControllerRector::class, [
    'leave_todo' => true,
])

->withConfiguredRule(EnforceInvokableControllerRector::class, [
    '

->withConfiguredRule(EnforceInvokableControllerRouteRector::class, [
    'leave_todo' => true,
])

->withConfiguredRule(EnforceRegisteredClassRector::class, [
    'registries' => [
        [
            'registry' => 'App\\Plugins\\PluginIndex',
            'implements' => 'App\\Plugins\\DescribesPlugin',
            'namespace' => 'App\\Plugins\\*',
        ],
    ],
])

->withConfiguredRule(ForbidAttributedClassDependencyRector::class, [
    'attributes' => [
        'App\\Domain\\Effect\\Effect',
        'App\\Domain\\Action\\Action',
    ],
])

->withConfiguredRule(ForbidBladeAttributeValueRector::class, [
    'attributes' => [
        'href' => '#^/#',
    ],
])

->withConfiguredRule(ForbidClassDependencyRector::class, [
    'dependencies' => [
        'App\\Plugins\\*' => [
            'Reflection*',
        ],
    ],
    'except' => [
        'App\\Plugins\\RouteTags\\LegacyBridge',
    ],
])

->withConfiguredRule(ForbidClassUsageRector::class, [
    'classes' => [
        'Illuminate\\Support\\Facades\\DB',
    ],
])

->withConfiguredRule(ForbidCommentPhraseRector::class, [
    'phrases' => [
        '/fixme/i',
    ],
])

->withConfiguredRule(ForbidDuplicateBladeElementRector::class, [
    'elements' => [
        'title',
    ],
])

->withConfiguredRule(ForbidKeywordUsageRector::class, [
    'keywords' => [
        'switch',
    ],
])

->withConfiguredRule(ForbidKeywordUsageRector::class, [
    'keywords' => [
        'match',
    ],
    'leave_todo' => true,
    'todo_comment' => '// FIXME: replace this match expression',
])

->withConfiguredRule(ForbidNamespaceDependencyRector::class, [
    'dependencies' => [
        'App\\Domain\\*' => [
            'App\\Http\\*',
        ],
    ],
    'except' => [
        'App\\Domain\\Registry',
    ],
])

->withConfiguredRule(RenameParamToMatchTypeExactCaseRector::class, [
    'leave_todo' => true,
])

->withConfiguredRule(EnforceInvokableControllerRouteRector::class, [
    EnforceInvokableControllerRouteRector::LEAVE_TODO => true,
])

'mcp' => [
    'enabled' => true,
    'handle' => 'laravel-rector',
],
bash
php artisan laravel-rector:install
bash
php artisan vendor:publish --tag=laravel-rector-config
diff
-// Route::get('/user', UserShow::class);
+// Route::get('/user', UserShowController::class);

-readonly class UserShow
+readonly class UserShowController
 {
     public function __invoke(User $User): View
     {
         return view('user.show', ['user' => $User]);
     }
 }
diff
 // Route::get('/user', UserShow::class);

+// TODO: Class "UserShow" is the controller for route "GET /user" and does not end in Controller. Rename it UserShowController.
 readonly class UserShow
 {
     public function __invoke(User $User): View
     {
         return view('user.show', ['user' => $User]);
     }
 }
diff
-class UserController
+readonly class UserShowController
 {
-    public function show(User $User): View
+    public function __invoke(User $User): View
     {
         return view('user.show', ['user' => $User]);
     }
 }
diff
-class UserController
+class UserShowController
 {
-    public function show(User $User): View
+    public function __invoke(User $User): View
     {
         return view('user.show', ['user' => $User]);
     }
 }
diff
 namespace App\Plugins\AdminLink;

 final class AdminLinkPlugin
 {
-    public function tagged(string $enum, string $case): array
+    public function tagged(TaggedRoute $TaggedRoute): array
     {
-        return new ReflectionEnumBackedCase($enum, $case)->getAttributes();
+        return $TaggedRoute->attributes;
     }
 }
diff
-// FIXME the empty case
-return $items[0];
+return $items[0] ?? null;
diff
-switch ($status) {
-    case 'paid':
-        return true;
-    default:
-        return false;
-}
+return $status === 'paid';
diff
+// FIXME: replace this match expression
 return match ($status) {
     'paid' => true,
     default => false,
 };
bash
claude mcp add laravel-rector -- php artisan mcp:start laravel-rector