Skip to content

Commit e0eb27c

Browse files
authored
Merge pull request #8236 from kenjis/feat-filter-check-required-filters
feat: `spark filter:check` shows "Required Filters"
2 parents 688081d + 631fdea commit e0eb27c

File tree

5 files changed

+101
-17
lines changed

5 files changed

+101
-17
lines changed

system/Commands/Utilities/FilterCheck.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ public function run(array $params)
106106
return EXIT_ERROR;
107107
}
108108

109+
$filters = $this->addRequiredFilters($filterCollector, $filters);
110+
109111
$tbody[] = [
110112
strtoupper($method),
111113
$route,
@@ -124,4 +126,29 @@ public function run(array $params)
124126

125127
return EXIT_SUCCESS;
126128
}
129+
130+
private function addRequiredFilters(FilterCollector $filterCollector, array $filters): array
131+
{
132+
$output = [];
133+
134+
$required = $filterCollector->getRequiredFilters();
135+
136+
$colored = [];
137+
138+
foreach ($required['before'] as $filter) {
139+
$filter = CLI::color($filter, 'yellow');
140+
$colored[] = $filter;
141+
}
142+
$output['before'] = array_merge($colored, $filters['before']);
143+
144+
$colored = [];
145+
146+
foreach ($required['after'] as $filter) {
147+
$filter = CLI::color($filter, 'yellow');
148+
$colored[] = $filter;
149+
}
150+
$output['after'] = array_merge($filters['after'], $colored);
151+
152+
return $output;
153+
}
127154
}

system/Commands/Utilities/Routes/FilterCollector.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use CodeIgniter\Config\Services;
1515
use CodeIgniter\Filters\Filters;
16+
use CodeIgniter\HTTP\Method;
1617
use CodeIgniter\HTTP\Request;
1718
use CodeIgniter\Router\Router;
1819
use Config\Filters as FiltersConfig;
@@ -37,6 +38,8 @@ public function __construct(bool $resetRoutes = false)
3738
}
3839

3940
/**
41+
* Returns filters for the URI
42+
*
4043
* @param string $method HTTP verb like `GET`,`POST` or `CLI`.
4144
* @param string $uri URI path to find filters for
4245
*
@@ -76,6 +79,24 @@ public function get(string $method, string $uri): array
7679
return $finder->find($uri);
7780
}
7881

82+
/**
83+
* Returns Required Filters
84+
*
85+
* @return array{before: list<string>, after: list<string>} array of filter alias or classname
86+
*/
87+
public function getRequiredFilters(): array
88+
{
89+
$request = Services::incomingrequest(null, false);
90+
$request->setMethod(Method::GET);
91+
92+
$router = $this->createRouter($request);
93+
$filters = $this->createFilters($request);
94+
95+
$finder = new FilterFinder($router, $filters);
96+
97+
return $finder->getRequiredFilters();
98+
}
99+
79100
private function createRouter(Request $request): Router
80101
{
81102
$routes = Services::routes();

system/Commands/Utilities/Routes/FilterFinder.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,20 @@ public function find(string $uri): array
7777
];
7878
}
7979
}
80+
81+
/**
82+
* Returns Required Filters
83+
*
84+
* @return array{before: list<string>, after:list<string>}
85+
*/
86+
public function getRequiredFilters(): array
87+
{
88+
[$requiredBefore] = $this->filters->getRequiredFilters('before');
89+
[$requiredAfter] = $this->filters->getRequiredFilters('after');
90+
91+
return [
92+
'before' => $requiredBefore,
93+
'after' => $requiredAfter,
94+
];
95+
}
8096
}

system/Filters/Filters.php

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,39 @@ private function runAfter(array $filterClasses): ResponseInterface
261261
* @internal
262262
*/
263263
public function runRequired(string $position = 'before')
264+
{
265+
[$filters, $aliases] = $this->getRequiredFilters($position);
266+
267+
if ($filters === []) {
268+
return $position === 'before' ? $this->request : $this->response;
269+
}
270+
271+
$filterClasses = [];
272+
273+
foreach ($filters as $alias) {
274+
if (is_array($aliases[$alias])) {
275+
$filterClasses[$position] = array_merge($filterClasses[$position], $aliases[$alias]);
276+
} else {
277+
$filterClasses[$position][] = $aliases[$alias];
278+
}
279+
}
280+
281+
if ($position === 'before') {
282+
return $this->runBefore($filterClasses[$position]);
283+
}
284+
285+
// After
286+
return $this->runAfter($filterClasses[$position]);
287+
}
288+
289+
/**
290+
* Returns required filters for the specified position.
291+
*
292+
* @phpstan-param 'before'|'after' $position
293+
*
294+
* @internal
295+
*/
296+
public function getRequiredFilters(string $position = 'before'): array
264297
{
265298
// For backward compatibility. For users who do not update Config\Filters.
266299
if (! isset($this->config->required[$position])) {
@@ -273,7 +306,7 @@ public function runRequired(string $position = 'before')
273306
}
274307

275308
if ($filters === []) {
276-
return $position === 'before' ? $this->request : $this->response;
309+
return [[], $aliases];
277310
}
278311

279312
if ($position === 'after') {
@@ -286,26 +319,13 @@ public function runRequired(string $position = 'before')
286319
}
287320
}
288321

289-
$filterClasses = [];
290-
291322
foreach ($filters as $alias) {
292323
if (! array_key_exists($alias, $aliases)) {
293324
throw FilterException::forNoAlias($alias);
294325
}
295-
296-
if (is_array($aliases[$alias])) {
297-
$filterClasses[$position] = array_merge($filterClasses[$position], $aliases[$alias]);
298-
} else {
299-
$filterClasses[$position][] = $aliases[$alias];
300-
}
301326
}
302327

303-
if ($position === 'before') {
304-
return $this->runBefore($filterClasses[$position]);
305-
}
306-
307-
// After
308-
return $this->runAfter($filterClasses[$position]);
328+
return [$filters, $aliases];
309329
}
310330

311331
/**

tests/system/Commands/FilterCheckTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ public function testFilterCheckDefinedRoute(): void
4545
command('filter:check GET /');
4646

4747
$this->assertStringContainsString(
48-
'|GET|/|||',
49-
str_replace(' ', '', $this->getBuffer())
48+
'| GET | / | forcehttps pagecache | pagecache performance toolbar |',
49+
preg_replace('/\033\[.+?m/u', '', $this->getBuffer())
5050
);
5151
}
5252

0 commit comments

Comments
 (0)