Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Middlewares для маршрута

Можно регистрировать middlewares во время регистрации маршрута, эти middlewares будут вызываться каждый раз при обработке маршрута.

Например, логировать обращения или делать другую типовую работу.

src/ExampleMiddleware.php - расположить можно где угодно, главное следовать psr4.

<?php

declare(strict_types=1);

namespace App;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Psr\Log\LoggerInterface;

final readonly class ExampleMiddleware implements MiddlewareInterface
{
    public function __construct(private LoggerInterface $logger)
    {
    }

    /**
     * @inheritDoc
     */
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        $this->logger->info('you can log request');
        $response = $handler->handle($request);
        $this->logger->info('you can log response');
        return $response;
    }
}

В php attribute маршрутов, есть параметр отвечающий за middlewares, можно там передавать необходимые middlewares.

// ...
#[Route\GET(
    pattern: '/',
    middlewares: [
        \App\ExampleMiddleware::class
    ]
)]
// ...

полный пример:

src/Welcome.php

<?php

declare(strict_types=1);

namespace App;

use Cekta\Framework\HTTP\Response\JSONFactory;
use Cekta\Framework\HTTP\Route;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

#[Route\GET(
    pattern: '/',
    middlewares: [
        \App\ExampleMiddleware::class
    ]
)]
final readonly class Welcome implements RequestHandlerInterface
{
    public function __construct(
        private JSONFactory $factory
    ) {
    }

    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        return $this->factory->create(['message' => 'welcome to cekta']);
    }
}

для применения изменений необходимо сделать build или restart

make restart

Теперь открывая маршруты будет вызываться наш middleware.