Skip to content

Commit 66b572a

Browse files
committed
fix: getFilterCaller() does not support Filter classes as array
1 parent cc185a8 commit 66b572a

2 files changed

Lines changed: 60 additions & 7 deletions

File tree

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: 11 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,6 +63,16 @@ 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');

0 commit comments

Comments
 (0)