From c75b555c93020a02347ec32727ef0d78a281d680 Mon Sep 17 00:00:00 2001 From: neznaika0 Date: Sun, 5 Nov 2023 13:48:40 +0300 Subject: [PATCH 1/6] fix: Command `routes` with `{locale}` in route --- .../Commands/Utilities/Routes/FilterFinder.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/system/Commands/Utilities/Routes/FilterFinder.php b/system/Commands/Utilities/Routes/FilterFinder.php index cc1f6d2b05f4..7c5c69e8d5a3 100644 --- a/system/Commands/Utilities/Routes/FilterFinder.php +++ b/system/Commands/Utilities/Routes/FilterFinder.php @@ -15,6 +15,7 @@ use CodeIgniter\Filters\Filters; use CodeIgniter\HTTP\Exceptions\RedirectException; use CodeIgniter\Router\Router; +use Config\App; use Config\Feature; use Config\Services; @@ -50,6 +51,12 @@ public function find(string $uri): array { $this->filters->reset(); + $isLocaleExist = strpos($uri, '{locale}') !== false; + + if ($isLocaleExist) { + $uri = str_replace('{locale}', config(App::class)->defaultLocale, $uri); + } + // Add route filters try { $routeFilters = $this->getRouteFilters($uri); @@ -64,7 +71,14 @@ public function find(string $uri): array $this->filters->initialize($uri); - return $this->filters->getFilters(); + $filters = $this->filters->getFilters(); + + if ($isLocaleExist) { + $filters['before'] = array_map(static fn ($filter) => '!' . $filter, $filters['before']); + $filters['after'] = array_map(static fn ($filter) => '!' . $filter, $filters['after']); + } + + return $filters; } catch (RedirectException $e) { return [ 'before' => [], From 6695480b9a7244d0bf232a29ecc3ac1397da8f87 Mon Sep 17 00:00:00 2001 From: neznaika0 Date: Mon, 6 Nov 2023 13:07:47 +0300 Subject: [PATCH 2/6] docs: Add note about filters --- user_guide_src/source/incoming/routing.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/user_guide_src/source/incoming/routing.rst b/user_guide_src/source/incoming/routing.rst index 39b5d3db8cdd..5dd50d9f7d94 100644 --- a/user_guide_src/source/incoming/routing.rst +++ b/user_guide_src/source/incoming/routing.rst @@ -923,6 +923,17 @@ The *Route* column shows the route path to match. The route of a defined route i Since v4.3.0, the *Name* column shows the route name. ``»`` indicates the name is the same as the route path. +Prior to v4.5.0, routes with ``{locale}`` and the enabled parameter ``$routes->shouldUseSupportedLocalesOnly(true)`` in **app/Config/Routes.php** were shown ```` in the *Filters* column. This was due to the fact that it was impossible to resolve filters for all languages. +Now routes having ``{locale}`` are output as ``!filtername``. This means that filters are set for a group of languages, but there is no guarantee of execution for each language. + +.. code-block:: none + + +--------+---------------+------+-----------+----------------+---------------+ + | Method | Route | Name | Handler | Before Filters | After Filters | + +--------+---------------+------+-----------+----------------+---------------+ + | GET | {locale}/feed | » | (Closure) | | !toolbar | + +--------+---------------+------+-----------+----------------+---------------+ + .. important:: The system is not perfect. If you use Custom Placeholders, *Filters* might not be correct. If you want to check filters for a route, you can use :ref:`spark filter:check ` command. Auto Routing (Improved) From 117a2ee3b3220b294f7773c07df5b2f5652ad7e9 Mon Sep 17 00:00:00 2001 From: neznaika0 Date: Mon, 6 Nov 2023 13:29:15 +0300 Subject: [PATCH 3/6] test: Add test for routes containing `{locale}` --- .../Utilities/Routes/FilterFinderTest.php | 51 +++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/tests/system/Commands/Utilities/Routes/FilterFinderTest.php b/tests/system/Commands/Utilities/Routes/FilterFinderTest.php index c59c9b9aee8e..92923ccdaece 100644 --- a/tests/system/Commands/Utilities/Routes/FilterFinderTest.php +++ b/tests/system/Commands/Utilities/Routes/FilterFinderTest.php @@ -52,6 +52,13 @@ protected function setUp(): void $this->moduleConfig->enabled = false; } + protected function tearDown(): void + { + parent::tearDown(); + + $this->resetServices(); + } + private function createRouteCollection(array $routes = []): RouteCollection { $collection = new RouteCollection(Services::locator(), $this->moduleConfig, new Routing()); @@ -137,7 +144,7 @@ public function testFindGlobalsFiltersWithRedirectRoute(): void public function testFindGlobalsAndRouteFilters(): void { $collection = $this->createRouteCollection(); - $collection->get('admin', ' AdminController::index', ['filter' => 'honeypot']); + $collection->get('admin', 'AdminController::index', ['filter' => 'honeypot']); $router = $this->createRouter($collection); $filters = $this->createFilters(); @@ -155,7 +162,7 @@ public function testFindGlobalsAndRouteFilters(): void public function testFindGlobalsAndRouteClassnameFilters(): void { $collection = $this->createRouteCollection(); - $collection->get('admin', ' AdminController::index', ['filter' => InvalidChars::class]); + $collection->get('admin', 'AdminController::index', ['filter' => InvalidChars::class]); $router = $this->createRouter($collection); $filters = $this->createFilters(); @@ -173,7 +180,7 @@ public function testFindGlobalsAndRouteClassnameFilters(): void public function testFindGlobalsAndRouteMultipleFilters(): void { $collection = $this->createRouteCollection(); - $collection->get('admin', ' AdminController::index', ['filter' => ['honeypot', InvalidChars::class]]); + $collection->get('admin', 'AdminController::index', ['filter' => ['honeypot', InvalidChars::class]]); $router = $this->createRouter($collection); $filters = $this->createFilters(); @@ -314,4 +321,42 @@ public function testFilterOrderWithOldFilterOrder() ]; $this->assertSame($expected, $filters); } + + public function testFindFiltersWithAnyLocales(): void + { + $collection = $this->createRouteCollection(); + $collection->useSupportedLocalesOnly(false); + $collection->get('{locale}/admin/(:segment)', 'AdminController::index/$1'); + Services::injectMock('routes', $collection); + $router = $this->createRouter($collection); + $filters = $this->createFilters(); + $finder = new FilterFinder($router, $filters); + + $filters = $finder->find('{locale}/admin/settings'); + + $expected = [ + 'before' => ['csrf'], + 'after' => ['toolbar'], + ]; + $this->assertSame($expected, $filters); + } + + public function testFindFiltersWithSupportedLocalesOnly(): void + { + $collection = $this->createRouteCollection(); + $collection->useSupportedLocalesOnly(true); + $collection->get('{locale}/admin/(:segment)', 'AdminController::index/$1'); + Services::injectMock('routes', $collection); + $router = $this->createRouter($collection); + $filters = $this->createFilters(); + $finder = new FilterFinder($router, $filters); + + $filters = $finder->find('{locale}/admin/settings'); + + $expected = [ + 'before' => ['!csrf'], + 'after' => ['!toolbar'], + ]; + $this->assertSame($expected, $filters); + } } From 674d875b378d79325806570561fe509f42dc5457 Mon Sep 17 00:00:00 2001 From: neznaika0 Date: Mon, 6 Nov 2023 13:30:45 +0300 Subject: [PATCH 4/6] fix: Correct the check condition --- system/Commands/Utilities/Routes/FilterFinder.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/system/Commands/Utilities/Routes/FilterFinder.php b/system/Commands/Utilities/Routes/FilterFinder.php index 7c5c69e8d5a3..7abd0d0d7c7d 100644 --- a/system/Commands/Utilities/Routes/FilterFinder.php +++ b/system/Commands/Utilities/Routes/FilterFinder.php @@ -51,9 +51,12 @@ public function find(string $uri): array { $this->filters->reset(); - $isLocaleExist = strpos($uri, '{locale}') !== false; + // Fix for the search filters command + $isSupportedLocaleOnly = false; + + if (strpos($uri, '{locale}') !== false && Services::routes()->shouldUseSupportedLocalesOnly()) { + $isSupportedLocaleOnly = true; - if ($isLocaleExist) { $uri = str_replace('{locale}', config(App::class)->defaultLocale, $uri); } @@ -73,7 +76,7 @@ public function find(string $uri): array $filters = $this->filters->getFilters(); - if ($isLocaleExist) { + if ($isSupportedLocaleOnly) { $filters['before'] = array_map(static fn ($filter) => '!' . $filter, $filters['before']); $filters['after'] = array_map(static fn ($filter) => '!' . $filter, $filters['after']); } From 231a7481f206d1d6bdfa74d538651a9f258bb137 Mon Sep 17 00:00:00 2001 From: neznaika0 Date: Mon, 6 Nov 2023 15:28:14 +0300 Subject: [PATCH 5/6] fix: Move code to `routes` command --- system/Commands/Utilities/Routes.php | 18 +++++++++++++++++- .../Utilities/Routes/FilterFinder.php | 19 +------------------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/system/Commands/Utilities/Routes.php b/system/Commands/Utilities/Routes.php index 5d20da07d514..a78b6adaf425 100644 --- a/system/Commands/Utilities/Routes.php +++ b/system/Commands/Utilities/Routes.php @@ -18,6 +18,7 @@ use CodeIgniter\Commands\Utilities\Routes\FilterCollector; use CodeIgniter\Commands\Utilities\Routes\SampleURIGenerator; use CodeIgniter\Router\DefinedRouteCollector; +use Config\App; use Config\Feature; use Config\Routing; use Config\Services; @@ -119,7 +120,22 @@ public function run(array $params) foreach ($definedRouteCollector->collect() as $route) { $sampleUri = $uriGenerator->get($route['route']); - $filters = $filterCollector->get($route['method'], $sampleUri); + + // Fix for the search filters command + $isSupportedLocaleOnly = false; + + if (strpos($sampleUri, '{locale}') !== false && Services::routes()->shouldUseSupportedLocalesOnly()) { + $isSupportedLocaleOnly = true; + + $sampleUri = str_replace('{locale}', config(App::class)->defaultLocale, $sampleUri); + } + + $filters = $filterCollector->get($route['method'], $sampleUri); + + if ($isSupportedLocaleOnly) { + $filters['before'] = array_map(static fn ($filter) => '!' . $filter, $filters['before']); + $filters['after'] = array_map(static fn ($filter) => '!' . $filter, $filters['after']); + } $routeName = ($route['route'] === $route['name']) ? '»' : $route['name']; diff --git a/system/Commands/Utilities/Routes/FilterFinder.php b/system/Commands/Utilities/Routes/FilterFinder.php index 7abd0d0d7c7d..cc1f6d2b05f4 100644 --- a/system/Commands/Utilities/Routes/FilterFinder.php +++ b/system/Commands/Utilities/Routes/FilterFinder.php @@ -15,7 +15,6 @@ use CodeIgniter\Filters\Filters; use CodeIgniter\HTTP\Exceptions\RedirectException; use CodeIgniter\Router\Router; -use Config\App; use Config\Feature; use Config\Services; @@ -51,15 +50,6 @@ public function find(string $uri): array { $this->filters->reset(); - // Fix for the search filters command - $isSupportedLocaleOnly = false; - - if (strpos($uri, '{locale}') !== false && Services::routes()->shouldUseSupportedLocalesOnly()) { - $isSupportedLocaleOnly = true; - - $uri = str_replace('{locale}', config(App::class)->defaultLocale, $uri); - } - // Add route filters try { $routeFilters = $this->getRouteFilters($uri); @@ -74,14 +64,7 @@ public function find(string $uri): array $this->filters->initialize($uri); - $filters = $this->filters->getFilters(); - - if ($isSupportedLocaleOnly) { - $filters['before'] = array_map(static fn ($filter) => '!' . $filter, $filters['before']); - $filters['after'] = array_map(static fn ($filter) => '!' . $filter, $filters['after']); - } - - return $filters; + return $this->filters->getFilters(); } catch (RedirectException $e) { return [ 'before' => [], From 4e872f730efd87222dacdd22328d269bd8ccc7e3 Mon Sep 17 00:00:00 2001 From: neznaika0 Date: Mon, 6 Nov 2023 15:28:54 +0300 Subject: [PATCH 6/6] test: Move code to RoutesTest.php --- tests/system/Commands/RoutesTest.php | 28 ++++++++++++ .../Utilities/Routes/FilterFinderTest.php | 45 ------------------- 2 files changed, 28 insertions(+), 45 deletions(-) diff --git a/tests/system/Commands/RoutesTest.php b/tests/system/Commands/RoutesTest.php index 9cd24cbe0f6b..fcb3906bcd38 100644 --- a/tests/system/Commands/RoutesTest.php +++ b/tests/system/Commands/RoutesTest.php @@ -223,4 +223,32 @@ public function testRoutesCommandRouteLegacy(): void EOL; $this->assertStringContainsString($expected, $this->getBuffer()); } + + public function testRoutesCommandWithAnyLocales(): void + { + $routes = $this->getCleanRoutes(); + $routes->useSupportedLocalesOnly(false); + $routes->get('{locale}/admin/(:segment)', 'AdminController::index/$1', ['as' => 'admin']); + + command('routes'); + + $expected = <<<'EOL' + | GET | {locale}/admin/([^/]+) | admin | \App\Controllers\AdminController::index/$1 | | toolbar | + EOL; + $this->assertStringContainsString($expected, $this->getBuffer()); + } + + public function testRoutesCommandWithSupportedLocalesOnly(): void + { + $routes = $this->getCleanRoutes(); + $routes->useSupportedLocalesOnly(true); + $routes->get('{locale}/admin/(:segment)', 'AdminController::index/$1', ['as' => 'admin']); + + command('routes'); + + $expected = <<<'EOL' + | GET | {locale}/admin/([^/]+) | admin | \App\Controllers\AdminController::index/$1 | | !toolbar | + EOL; + $this->assertStringContainsString($expected, $this->getBuffer()); + } } diff --git a/tests/system/Commands/Utilities/Routes/FilterFinderTest.php b/tests/system/Commands/Utilities/Routes/FilterFinderTest.php index 92923ccdaece..d607e46a38b9 100644 --- a/tests/system/Commands/Utilities/Routes/FilterFinderTest.php +++ b/tests/system/Commands/Utilities/Routes/FilterFinderTest.php @@ -52,13 +52,6 @@ protected function setUp(): void $this->moduleConfig->enabled = false; } - protected function tearDown(): void - { - parent::tearDown(); - - $this->resetServices(); - } - private function createRouteCollection(array $routes = []): RouteCollection { $collection = new RouteCollection(Services::locator(), $this->moduleConfig, new Routing()); @@ -321,42 +314,4 @@ public function testFilterOrderWithOldFilterOrder() ]; $this->assertSame($expected, $filters); } - - public function testFindFiltersWithAnyLocales(): void - { - $collection = $this->createRouteCollection(); - $collection->useSupportedLocalesOnly(false); - $collection->get('{locale}/admin/(:segment)', 'AdminController::index/$1'); - Services::injectMock('routes', $collection); - $router = $this->createRouter($collection); - $filters = $this->createFilters(); - $finder = new FilterFinder($router, $filters); - - $filters = $finder->find('{locale}/admin/settings'); - - $expected = [ - 'before' => ['csrf'], - 'after' => ['toolbar'], - ]; - $this->assertSame($expected, $filters); - } - - public function testFindFiltersWithSupportedLocalesOnly(): void - { - $collection = $this->createRouteCollection(); - $collection->useSupportedLocalesOnly(true); - $collection->get('{locale}/admin/(:segment)', 'AdminController::index/$1'); - Services::injectMock('routes', $collection); - $router = $this->createRouter($collection); - $filters = $this->createFilters(); - $finder = new FilterFinder($router, $filters); - - $filters = $finder->find('{locale}/admin/settings'); - - $expected = [ - 'before' => ['!csrf'], - 'after' => ['!toolbar'], - ]; - $this->assertSame($expected, $filters); - } }