@@ -118,6 +118,13 @@ class Filters
118
118
'after ' => [],
119
119
];
120
120
121
+ /**
122
+ * List of filter class instances.
123
+ *
124
+ * @var array<class-string, FilterInterface> [classname => instance]
125
+ */
126
+ protected array $ filterClassInstances = [];
127
+
121
128
/**
122
129
* Any arguments to be passed to filters.
123
130
*
@@ -230,7 +237,17 @@ private function runBefore(array $filterClassList)
230
237
$ className = $ filterClassInfo [0 ];
231
238
$ arguments = ($ filterClassInfo [1 ] === []) ? null : $ filterClassInfo [1 ];
232
239
233
- $ class = new $ className ();
240
+ if (isset ($ this ->filterClassInstances [$ className ])) {
241
+ $ class = $ this ->filterClassInstances [$ className ];
242
+ } else {
243
+ $ class = new $ className ();
244
+
245
+ if (! $ class instanceof FilterInterface) {
246
+ throw FilterException::forIncorrectInterface ($ class ::class);
247
+ }
248
+
249
+ $ this ->filterClassInstances [$ className ] = $ class ;
250
+ }
234
251
235
252
if (! $ class instanceof FilterInterface) {
236
253
throw FilterException::forIncorrectInterface ($ class ::class);
@@ -271,10 +288,16 @@ private function runAfter(array $filterClassList): ResponseInterface
271
288
$ className = $ filterClassInfo [0 ];
272
289
$ arguments = ($ filterClassInfo [1 ] === []) ? null : $ filterClassInfo [1 ];
273
290
274
- $ class = new $ className ();
291
+ if (isset ($ this ->filterClassInstances [$ className ])) {
292
+ $ class = $ this ->filterClassInstances [$ className ];
293
+ } else {
294
+ $ class = new $ className ();
275
295
276
- if (! $ class instanceof FilterInterface) {
277
- throw FilterException::forIncorrectInterface ($ class ::class);
296
+ if (! $ class instanceof FilterInterface) {
297
+ throw FilterException::forIncorrectInterface ($ class ::class);
298
+ }
299
+
300
+ $ this ->filterClassInstances [$ className ] = $ class ;
278
301
}
279
302
280
303
$ result = $ class ->after ($ this ->request , $ this ->response , $ arguments );
0 commit comments