@@ -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 /**
0 commit comments