A PSR-7/15 Middleware can be added to routes, groups, and controllers. To add a middleware to a route or controller, you must add it as a class string (AddHeaderMiddleware::class) or as an alias (csrf.token) as defined in config/app.php.

Adding Middleware to Routes

At it's simplest, adding Middleware to a route can be done by passing the class string to the middleware() method:

<?php

use Application\Http\Controller\HomeController;
use Application\Http\Middleware\AddHeaderMiddleware;
use Qubus\Routing\Route\RouteGroup;

return function (\Qubus\Routing\Psr7Router $router) {
    $router->group(params: '', callback: function (RouteGroup $group) {
        $group
        ->get(uri: '/', callback: function(HomeController $controller) {
            return $controller->index();
        })
        ->middleware(AddHeaderMiddleware::class);
    });
};

File: ./routes/web/web.php

Multiple middleware can be added by passing more parameters to the middleware() method:

<?php

use Application\Http\Controller\HomeController;
use Application\Http\Middleware\AddHeaderMiddleware;
use Application\Http\Middleware\AuthMiddleware;
use Qubus\Routing\Route\RouteGroup;

return function (\Qubus\Routing\Psr7Router $router) {
    $router->group(params: '', callback: function (RouteGroup $group) {
        $group
        ->get(uri: '/', callback: function(HomeController $controller) {
            return $controller->index();
        })
        ->middleware(
            AddHeaderMiddleware::class,
            AuthMiddleware::class
        );
    });
};

File: ./routes/web/web.php

Or alternatively, you can also pass an array of middleware:

<?php

use Application\Http\Controller\HomeController;
use Application\Http\Middleware\AddHeaderMiddleware;
use Application\Http\Middleware\AuthMiddleware;
use Qubus\Routing\Route\RouteGroup;

return function (\Qubus\Routing\Psr7Router $router) {
    $router->group(params: '', callback: function (RouteGroup $group) {
        $group
        ->get(uri: '/', callback: function(HomeController $controller) {
            return $controller->index();
        })
        ->middleware([
            AddHeaderMiddleware::class,
            AuthMiddleware::class
        ]);
    });
};

File: ./routes/web/web.php

Middleware Aliases

You may assign aliases to middleware in your application's bootstrap/app.php file using the withMiddleware method:

<?php

declare(strict_types=1);

use Codefy\Framework\Application as DevflowApp;
use Codefy\Framework\Configuration\Middleware;
use Qubus\Exception\Data\TypeException;

use function Codefy\Framework\Helpers\env;

try {
    $app = DevflowApp::create(
        config: [
            'basePath' => env(key: 'APP_BASE_PATH', default: dirname(path: __DIR__))
        ]
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->alias([
            'debugbar' => Codefy\Framework\Http\Middleware\DebugBarMiddleware::class
        ]);
    })->return();

    $app->share(nameOrInstance: $app);

    return $app::getInstance();
} catch (TypeException|ReflectionException $e) {
    return $e->getMessage();
}

Middleware aliases allow you to define a short alias for a given middleware class, which can be especially useful for middleware with long class names:

Alias Middleware
api Codefy\Framework\Http\Middleware\ApiMiddleware::class
security.headers Codefy\Framework\Http\Middleware\SecureHeaders\ContentSecurityPolicyMiddleware::class
content.cache Codefy\Framework\Http\Middleware\ContentCacheMiddleware::class.
cors Codefy\Framework\Http\Middleware\CorsMiddleware::class
csrf.token Codefy\Framework\Http\Middleware\Csrf\CsrfTokenMiddleware::class
csrf.protection Codefy\Framework\Http\Middleware\Csrf\CsrfProtectionMiddleware::class
css.minify Codefy\Framework\Http\Middleware\CssMinifierMiddleware::class
gate Codefy\Framework\Http\Middleware\Auth\GateMiddleware::class
honeypot Codefy\Framework\Http\Middleware\Spam\HoneyPotMiddleware::class
html.minify Codefy\Framework\Http\Middleware\HtmlMinifierMiddleware::class
http.cache Codefy\Framework\Http\Middleware\Cache\CacheMiddleware::class
http.cache.clear.data Codefy\Framework\Http\Middleware\Cache\ClearSiteDataMiddleware::class
http.cache.expires Codefy\Framework\Http\Middleware\Cache\CacheExpiresMiddleware::class
http.cache.prevention Codefy\Framework\Http\Middleware\Cache\CachePreventionMiddleware::class
js.minify Codefy\Framework\Http\Middleware\JsMinifierMiddleware::class
rate.limiter Codefy\Framework\Http\Middleware\ThrottleMiddleware::class
referrer.spam Codefy\Framework\Http\Middleware\Spam\ReferrerSpamMiddleware::class
user.authenticate Codefy\Framework\Http\Middleware\Auth\AuthenticationMiddleware::class
user.session Codefy\Framework\Http\Middleware\Auth\UserSessionMiddleware::class
user.authorization Codefy\Framework\Http\Middleware\Auth\UserAuthorizationMiddleware::class
user.session.expire Codefy\Framework\Http\Middleware\Auth\ExpireUserSessionMiddleware::class
php.debugbar Codefy\Framework\Http\Middleware\DebugBarMiddleware::class
http.exception Codefy\Framework\Http\Middleware\Exception\HttpExceptionMiddleware::class
html.http.exception Codefy\Framework\Http\Middleware\Exception\HtmlHttpExceptionMiddleware::class
json.http.exception Codefy\Framework\Http\Middleware\Exception\JsonHttpExceptionMiddleware::class
redirect.http.exception Codefy\Framework\Http\Middleware\Exception\RedirectionHttpExceptionMiddleware::class
bind.request Codefy\Framework\Http\Middleware\BindRequestMiddleware::class
user.cookie.decrypt Codefy\Framework\Http\Middleware\Auth\UserCookieDecryptMiddleware::class

Base Middleware

If you would like to add a middleware that is going to affect all routes, then use base_middlewares array in your config/app.php File:

<?php
    //

    /*
    |--------------------------------------------------------------------------
    | Base Middlewares
    |--------------------------------------------------------------------------
    | Register middleware class strings or aliases to be applied to the entire
    | application.
    */
    'base_middlewares' => [
        'csrf.token',
        'csrf.protection',
        'http.cache.prevention',
        'user.cookie.decrypt',
        'bind.request',
        'debugbar',
        'http.exception',
    ],

    //

File: ./config/app.php

Route Group

Middleware can also be added to a group. To do so you need to pass an array as the first parameter of the group() function instead of a string. You can add one middleware or an array of middleware.

<?php

use Application\Http\Middleware\AddHeaderMiddleware;
use Qubus\Routing\Route\RouteGroup;

return function (\Qubus\Routing\Psr7Router $router) {
    $router->group(
        params: ['prefix' => 'my-prefix', 'middleware' => [AddHeaderMiddleware::class]],
        callback: function (RouteGroup $group) {
            $group->map(['GET'], 'route1', function () {}); // `/my-prefix/route1`
            $group->map(['GET'], 'route2', function () {}); // `/my-prefix/route2`
        }
    );
};

File: ./routes/web/web.php

Middleware on Controllers

You can also apply Middleware on a Controller class too. In order to do this your Controller must extend the Codefy\Framework\Http\BaseController abstract class.

Middleware is added by using the middleware property in your Controller.

<?php

declare(strict_types=1);

namespace Application\Http\Controller;

use Application\Http\Middleware\AddHeaderMiddleware;
use Application\Http\Middleware\AuthMiddleware;
use Codefy\Framework\Http\BaseController;
use Qubus\Http\Session\SessionService;
use Qubus\Routing\Router;
use Qubus\View\Renderer;

final class PostController extends BaseController
{
    protected array $middlewares = [
        AddHeaderMiddleware::class,
        AuthMiddleware::class
    ];
}

File: ./src/Application/Http/Controller/PostController.php