diff --git a/src/Rector/StaticCall/RouteActionCallableRector.php b/src/Rector/StaticCall/RouteActionCallableRector.php index 898ccb36..958e9f67 100644 --- a/src/Rector/StaticCall/RouteActionCallableRector.php +++ b/src/Rector/StaticCall/RouteActionCallableRector.php @@ -128,8 +128,28 @@ public function refactor(Node $node): ?Node $segments[1], ]); - if (is_array($argValue)) { - return new MethodCall($node, 'name', [new Arg(new String_($argValue['as']))]); + if (is_array($argValue) && isset($argValue['as'])) { + $node = new MethodCall($node, 'name', [new Arg(new String_($argValue['as']))]); + } + + if ( + is_array($argValue) + && isset($argValue['middleware']) + && (is_string($argValue['middleware']) || is_array($argValue['middleware'])) + ) { + if (is_string($argValue['middleware'])) { + $argument = new String_($argValue['middleware']); + } else { + $argument = new Node\Expr\Array_(array_map( + static fn ($value) => new Node\Expr\ArrayItem(new String_($value)), + $argValue['middleware'] + )); + } + $node = new MethodCall( + $node, + 'middleware', + [new Arg($argument)] + ); } return $node; @@ -152,6 +172,8 @@ public function configure(array $configuration): void } /** + * @param mixed $action + * * @return array{string, string}|null */ private function resolveControllerFromAction(mixed $action): ?array @@ -201,7 +223,7 @@ private function isActionString(mixed $action): bool $keys = array_keys($action); sort($keys); - return $keys === ['as', 'uses']; + return in_array('uses', $keys, true) && array_diff($keys, ['as', 'middleware', 'uses']) === []; } return str_contains($action, '@'); diff --git a/tests/Rector/StaticCall/RouteActionCallableRector/Fixture/named_route_with_middleware.php.inc b/tests/Rector/StaticCall/RouteActionCallableRector/Fixture/named_route_with_middleware.php.inc new file mode 100644 index 00000000..9e30053e --- /dev/null +++ b/tests/Rector/StaticCall/RouteActionCallableRector/Fixture/named_route_with_middleware.php.inc @@ -0,0 +1,41 @@ + 'users.index', 'middleware' => 'auth', 'uses' => 'SomeController@index']); +Route::get('/users', ['as' => 'users.index', 'uses' => 'SomeController@index', 'middleware' => 'auth']); +Route::get('/users', ['uses' => 'SomeController@index', 'middleware' => 'auth', 'as' => 'users.index']); +Route::get('/users', ['uses' => 'SomeController@index', 'as' => 'users.index', 'middleware' => 'auth']); +Route::get('/users', ['middleware' => 'auth', 'as' => 'users.index', 'uses' => 'SomeController@index']); +Route::get('/users', ['middleware' => 'auth', 'uses' => 'SomeController@index', 'as' => 'users.index']); +Route::get('/users', ['as' => 'users.index', 'middleware' => ['auth', 'throttle:20,1'], 'uses' => 'SomeController@index']); +Route::get('/users', ['as' => 'users.index', 'uses' => 'SomeController@index', 'middleware' => ['auth', 'throttle:20,1']]); +Route::get('/users', ['uses' => 'SomeController@index', 'as' => 'users.index', 'middleware' => ['auth', 'throttle:20,1']]); +Route::get('/users', ['uses' => 'SomeController@index', 'middleware' => ['auth', 'throttle:20,1'], 'as' => 'users.index']); +Route::get('/users', ['middleware' => ['auth', 'throttle:20,1'], 'uses' => 'SomeController@index', 'as' => 'users.index']); +Route::get('/users', ['middleware' => ['auth', 'throttle:20,1'], 'as' => 'users.index', 'uses' => 'SomeController@index']); + +?> +----- +name('users.index')->middleware('auth'); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->name('users.index')->middleware('auth'); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->name('users.index')->middleware('auth'); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->name('users.index')->middleware('auth'); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->name('users.index')->middleware('auth'); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->name('users.index')->middleware('auth'); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->name('users.index')->middleware(['auth', 'throttle:20,1']); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->name('users.index')->middleware(['auth', 'throttle:20,1']); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->name('users.index')->middleware(['auth', 'throttle:20,1']); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->name('users.index')->middleware(['auth', 'throttle:20,1']); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->name('users.index')->middleware(['auth', 'throttle:20,1']); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->name('users.index')->middleware(['auth', 'throttle:20,1']); + +?> diff --git a/tests/Rector/StaticCall/RouteActionCallableRector/Fixture/only_array_route.php.inc b/tests/Rector/StaticCall/RouteActionCallableRector/Fixture/only_array_route.php.inc new file mode 100644 index 00000000..6c0a80ae --- /dev/null +++ b/tests/Rector/StaticCall/RouteActionCallableRector/Fixture/only_array_route.php.inc @@ -0,0 +1,21 @@ + 'SomeController@index']); +Route::get('/users', ['uses' => 'SomeController@index']); + +?> +----- + diff --git a/tests/Rector/StaticCall/RouteActionCallableRector/Fixture/route_with_middleware.php.inc b/tests/Rector/StaticCall/RouteActionCallableRector/Fixture/route_with_middleware.php.inc new file mode 100644 index 00000000..ce0d3b98 --- /dev/null +++ b/tests/Rector/StaticCall/RouteActionCallableRector/Fixture/route_with_middleware.php.inc @@ -0,0 +1,25 @@ + 'auth', 'uses' => 'SomeController@index']); +Route::get('/users', ['uses' => 'SomeController@index', 'middleware' => 'auth']); +Route::get('/users', ['middleware' => ['auth', 'throttle:20,1'], 'uses' => 'SomeController@index']); +Route::get('/users', ['uses' => 'SomeController@index', 'middleware' => ['auth', 'throttle:20,1']]); + +?> +----- +middleware('auth'); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->middleware('auth'); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->middleware(['auth', 'throttle:20,1']); +Route::get('/users', [\RectorLaravel\Tests\Rector\StaticCall\RouteActionCallableRector\Source\SomeController::class, 'index'])->middleware(['auth', 'throttle:20,1']); + +?>