Skip to content

Commit 4c09ca3

Browse files
authored
Merge pull request #8058 from kenjis/fix-filters-var-type
fix: FilterTestTrait::getFilterCaller() does not support Filter classes as array
2 parents 9e5cdd0 + 66b572a commit 4c09ca3

File tree

3 files changed

+64
-9
lines changed

3 files changed

+64
-9
lines changed

app/Config/Filters.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ class Filters extends BaseConfig
1515
* Configures aliases for Filter classes to
1616
* make reading things nicer and simpler.
1717
*
18-
* @var array<string, string>
19-
* @phpstan-var array<string, class-string>
18+
* @var array<string, array<int, string>|string> [filter_name => classname]
19+
* or [filter_name => [classname1, classname2, ...]]
20+
* @phpstan-var array<string, class-string|list<class-string>>
2021
*/
2122
public array $aliases = [
2223
'csrf' => CSRF::class,

system/Test/FilterTestTrait.php

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,26 +132,68 @@ protected function getFilterCaller($filter, string $position): Closure
132132
throw new RuntimeException("No filter found with alias '{$filter}'");
133133
}
134134

135-
$filter = $this->filtersConfig->aliases[$filter];
135+
$filterClasses = $this->filtersConfig->aliases[$filter];
136136
}
137137

138-
// Get an instance
139-
$filter = new $filter();
138+
$filterClasses = (array) $filterClasses;
140139
}
141140

142-
if (! $filter instanceof FilterInterface) {
143-
throw FilterException::forIncorrectInterface(get_class($filter));
141+
foreach ($filterClasses as $class) {
142+
// Get an instance
143+
$filter = new $class();
144+
145+
if (! $filter instanceof FilterInterface) {
146+
throw FilterException::forIncorrectInterface(get_class($filter));
147+
}
144148
}
145149

146150
$request = clone $this->request;
147151

148152
if ($position === 'before') {
149-
return static fn (?array $params = null) => $filter->before($request, $params);
153+
return static function (?array $params = null) use ($filterClasses, $request) {
154+
foreach ($filterClasses as $class) {
155+
$filter = new $class();
156+
157+
$result = $filter->before($request, $params);
158+
159+
// @TODO The following logic is in Filters class.
160+
// Should use Filters class.
161+
if ($result instanceof RequestInterface) {
162+
$request = $result;
163+
164+
continue;
165+
}
166+
if ($result instanceof ResponseInterface) {
167+
return $result;
168+
}
169+
if (empty($result)) {
170+
continue;
171+
}
172+
}
173+
174+
return $result;
175+
};
150176
}
151177

152178
$response = clone $this->response;
153179

154-
return static fn (?array $params = null) => $filter->after($request, $response, $params);
180+
return static function (?array $params = null) use ($filterClasses, $request, $response) {
181+
foreach ($filterClasses as $class) {
182+
$filter = new $class();
183+
184+
$result = $filter->after($request, $response, $params);
185+
186+
// @TODO The following logic is in Filters class.
187+
// Should use Filters class.
188+
if ($result instanceof ResponseInterface) {
189+
$response = $result;
190+
191+
continue;
192+
}
193+
}
194+
195+
return $result;
196+
};
155197
}
156198

157199
/**

tests/system/Test/FilterTestTraitTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace CodeIgniter\Test;
1313

1414
use CodeIgniter\HTTP\RequestInterface;
15+
use Config\Services;
1516
use Tests\Support\Filters\Customfilter;
1617

1718
/**
@@ -62,12 +63,23 @@ public function testGetCallerInvalidPosition(): void
6263
$this->getFilterCaller('test-customfilter', 'banana');
6364
}
6465

66+
public function testCallerSupportArray(): void
67+
{
68+
$this->filtersConfig->aliases['test-customfilter'] = [Customfilter::class];
69+
70+
$caller = $this->getFilterCaller('test-customfilter', 'before');
71+
$result = $caller();
72+
73+
$this->assertSame('http://hellowworld.com', $result->getBody());
74+
}
75+
6576
public function testCallerUsesClonedInstance(): void
6677
{
6778
$caller = $this->getFilterCaller('test-customfilter', 'before');
6879
$result = $caller();
6980

7081
$this->assertSame('http://hellowworld.com', $result->getBody());
82+
$this->assertNull(Services::response()->getBody());
7183

7284
$this->resetServices();
7385
}

0 commit comments

Comments
 (0)