@@ -173,7 +173,7 @@ public function handleMiddleware()
173173
174174 if (
175175 ($ middlewareObj = $ router ->getRegisteredMiddleware ($ middleware ))
176- && ($ response = $ this ->invokeAsReflection ($ middlewareObj , 'handle ' )) !== true
176+ && ($ response = $ this ->invokeAsReflection ($ middlewareObj , 'handle ' , $ params )) !== true
177177 ) {
178178 $ this ->setResponse ($ response );
179179 $ this ->sendResponse ();
@@ -216,7 +216,8 @@ public function getRouteParamValue($name)
216216
217217 public function getParamValue (ReflectionParameter $ param )
218218 {
219- $ value = $ param ->isOptional () && $ param ->isDefaultValueAvailable () ? $ param ->getDefaultValue () : null ;
219+ $ value = !$ param ->isOptional () && $ param ->isDefaultValueAvailable () ? $ param ->getDefaultValue () : null ;
220+
220221 $ paramName = $ param ->getName ();
221222 if ($ isRouteParam = $ this ->getRouteParamValue ($ paramName )) {
222223 $ value = $ isRouteParam ;
@@ -328,6 +329,31 @@ private function setRequest($request = null)
328329 $ this ->_request ->setApiRequest ($ this ->_restRequest );
329330 }
330331
332+ $ this ->authorize ();
333+ $ this ->validate ();
334+
335+ return $ this ->_request ;
336+ }
337+
338+ private function authorize ()
339+ {
340+ if (method_exists ($ this ->_request , 'authorize ' ) && $ this ->_request ->authorize ()) {
341+ $ message = 'You are not authorized to access this endpoint ' ;
342+ if (method_exists ($ this ->_request , 'failedAuthorizationMessage ' )) {
343+ $ message = $ this ->_request ->failedAuthorizationMessage ();
344+ }
345+
346+ $ this ->setResponse (
347+ Response::error ([])
348+ ->code ('NOT_AUTHORIZED ' )
349+ ->message ($ message )
350+ );
351+ $ this ->sendResponse ();
352+ }
353+ }
354+
355+ private function validate ()
356+ {
331357 if (method_exists ($ this ->_request , 'rules ' )) {
332358 $ messages = [];
333359 $ attributes = [];
@@ -340,15 +366,18 @@ private function setRequest($request = null)
340366 $ attributes = $ this ->_request ->attributes ();
341367 }
342368
343- $ validation = $ this ->_request ->make ($ this ->_request ->all (), $ this ->_request ->rules (), $ messages , $ attributes );
369+ $ validation = $ this ->_request ->make (
370+ $ this ->_request ->all (),
371+ $ this ->_request ->rules (),
372+ $ messages ,
373+ $ attributes
374+ );
344375
345376 if ($ validation ->fails ()) {
346377 $ this ->setResponse (Response::error ($ validation ->errors ())->code ('VALIDATION ' ));
347378 $ this ->sendResponse ();
348379 }
349380 }
350-
351- return $ this ->_request ;
352381 }
353382
354383 private function register ($ method , $ path , $ action )
@@ -394,14 +423,27 @@ private function handleAction()
394423 }
395424 }
396425
397- private function invokeAsReflection ($ class , $ method )
426+ private function invokeAsReflection ($ class , $ method, $ params = [] )
398427 {
399428 $ reflectionMethod = new ReflectionMethod ($ class , $ method );
400- $ params = [];
401- foreach ($ reflectionMethod ->getParameters () as $ id => $ param ) {
402- $ params [] = $ this ->getParamValue ($ param );
429+ $ reflectionParams = $ reflectionMethod ->getParameters ();
430+
431+ /**
432+ * If the ReflectionMethod is a method of a Middleware then we will set the first parameter.
433+ * First parameter will be Request object
434+ * Rest of params will be from Middleware ex: 'role:admin'
435+ *
436+ * If params count is 0 then the method is handle of Middleware and called from handleMiddleware
437+ */
438+ $ reflectionParams = \count ($ params ) === 0 ? $ reflectionParams : [$ reflectionParams [0 ]];
439+
440+ $ requestParams = [];
441+ foreach ($ reflectionParams as $ param ) {
442+ $ requestParams [] = $ this ->getParamValue ($ param );
403443 }
404444
445+ $ params = array_merge ($ requestParams , $ params );
446+
405447 return $ reflectionMethod ->invoke ($ reflectionMethod ->isStatic () ? null : new $ class (), ...$ params );
406448 }
407449
0 commit comments