From e2b95c2781f0899c00e0f8210bdd474216b82ab2 Mon Sep 17 00:00:00 2001 From: Rias Date: Thu, 28 May 2026 20:08:02 +0200 Subject: [PATCH 1/2] Namespace plugin action routes --- src/Plugin/Concerns/HasRoutes.php | 8 +++++++- tests/Unit/Plugin/Concerns/HasRoutesTest.php | 8 +++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Plugin/Concerns/HasRoutes.php b/src/Plugin/Concerns/HasRoutes.php index 64453597d62..2a0452bcc04 100644 --- a/src/Plugin/Concerns/HasRoutes.php +++ b/src/Plugin/Concerns/HasRoutes.php @@ -49,17 +49,23 @@ protected function registerCpRoutes(string|Closure $routes): void protected function registerActionRoutes(string|Closure $routes): void { + $handle = self::getInstance()->handle; + $this->app['router'] ->middleware(['web', 'craft', 'craft.cp']) ->prefix(implode('/', [ Cms::config()->cpTrigger, Cms::config()->actionTrigger, + $handle, ])) ->group($routes); $this->app['router'] ->middleware(['craft', 'craft.web']) - ->prefix(Cms::config()->actionTrigger) + ->prefix(implode('/', [ + Cms::config()->actionTrigger, + $handle, + ])) ->group($routes); } } diff --git a/tests/Unit/Plugin/Concerns/HasRoutesTest.php b/tests/Unit/Plugin/Concerns/HasRoutesTest.php index 3b99fdbba9c..3c8a9784c09 100644 --- a/tests/Unit/Plugin/Concerns/HasRoutesTest.php +++ b/tests/Unit/Plugin/Concerns/HasRoutesTest.php @@ -37,12 +37,14 @@ expect($uris)->toContain('plugin-web') ->and($uris)->toContain('admin/plugin-cp') - ->and($uris)->toContain('admin/actions/plugin-action') - ->and($uris)->toContain('actions/plugin-action'); + ->and($uris)->toContain('admin/actions/test-plugin/plugin-action') + ->and($uris)->toContain('actions/test-plugin/plugin-action') + ->and($uris)->not()->toContain('admin/actions/plugin-action') + ->and($uris)->not()->toContain('actions/plugin-action'); $routesByUri = collect(Route::getRoutes()->getRoutes()) ->keyBy(fn ($route) => $route->uri()); expect($routesByUri->get('admin/plugin-cp')->middleware())->toContain('web', 'craft', 'craft.cp') - ->and($routesByUri->get('admin/actions/plugin-action')->middleware())->toContain('web', 'craft', 'craft.cp'); + ->and($routesByUri->get('admin/actions/test-plugin/plugin-action')->middleware())->toContain('web', 'craft', 'craft.cp'); }); From c8ead80452d25611fc7f8719114a5105181cef54 Mon Sep 17 00:00:00 2001 From: Rias Date: Thu, 28 May 2026 20:09:05 +0200 Subject: [PATCH 2/2] Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a66048a7d4..f50f0ff54ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- Fixed a bug where legacy plugin-defined `actions.php` routes could collide between plugins. ([#18994](https://github.com/craftcms/cms/pull/18994)) - Fixed a bug where JavaScript and CSS registered by utility pages weren’t executed when navigating between utility pages, and weren’t cleaned up when navigating away. ([#18978](https://github.com/craftcms/cms/issues/18978)) - Fixed a bug where custom element authorization methods weren’t respected by Laravel element policies. ([#18983](https://github.com/craftcms/cms/pull/18983))