<?phpnamespaceApp/Middleware;useDominus\Services\Http\Models\HttpStatus;useDominus\Dominus\System\Middleware;useDominus\Dominus\System\MiddlewareResolution;useDominus\Dominus\System\Request;classUserTokenValidMiddlewareextendsMiddleware{// Middleware also supports dependency injectionpublicfunction__construct(privateIdentityProvider$idp){}/** * Handle the current request. * * @param Request $request * @param mixed $prevMiddlewareRes The data from the middleware that has run before this one. * The value will be NULL if there is no data or this is the first middleware to run. * * @return MiddlewareResolution */publicfunctionhandle(Request$request,mixed$prevMiddlewareRes):MiddlewareResolution{$token=$this->idp->decodeToken($request->getParam('token'));if(!$token->isValid){$this->reject(httpStatusCode:HttpStatus::UNAUTHORIZED);}// pass along the decoded token to the next middlewarereturn$this->next($token);}}
We can now use middleware on our controller using the #[Middleware] attribute. Using it on the controller will run the middleware for every endpoint.
We can use multiple middleware on a controller or controller method, and these will run sequentially passing data between each other in order.
Let's take our previous example, where we defined a middleware that helps us validate the user authentication token. We would like to also validate the user roles.
We will use the following middleware to check user roles:
<?phpnamespaceApp/Middleware;useDominus\Services\Http\Models\HttpStatus;useDominus\Dominus\System\Middleware;useDominus\Dominus\System\MiddlewareResolution;useDominus\Dominus\System\Request;classUserRolesMiddlewareextendsMiddleware{publicfunction__construct(publicarray$requiredRoles){}/** * Handle the current request. * * @param Request $request * @param mixed $prevMiddlewareRes The data from the middleware that has run before this one. * The value will be NULL if there is no data or this is the first middleware to run. * * @return MiddlewareResolution */publicfunctionhandle(Request$request,mixed$prevMiddlewareRes):MiddlewareResolution{/** * We will fetch the decoded token passed along by the previously executed UserTokenValidMiddleware middleware * @var TokenModel $token */$token=$prevMiddlewareRes;if(!$token->hasRoles($this->requiredRoles)){$this->reject(httpStatusCode:HttpStatus::FORBIDDEN);}return$this->next();}}
We can now place the middleware on our list endpoint like so:
<?phpnamespaceModules\TodoList\Controllers;useDominus\Middleware\UserTokenValidMiddleware;useDominus\System\Controller;useDominus\System\Attributes\Entrypoint;useDominus\System\Attributes\Middleware;useDominus\System\Attributes\RequestMethod;#[Entrypoint('list')]#[Middleware(UserTokenValidMiddleware::class)]classTodoListControllerextendsController{// the second parameter of the Middleware attribute // allows us to pass arguments to the middleware constructor//// Here, for example the array key 'requiredRoles' // will be passed to the constructor's $requiredRoles parameter#[Middleware(UserRolesMiddleware::class,['requiredRoles'=>['normal-user']])]#[RequestMethod('GET')]publicfunctionlist(){return['item 1','item 2','item 3'];}}