Правильный ли пример реализации middleware?
Тестовый класс middleware
spoiler
namespace App\Middleware;
use Engine\Core\Middleware\MiddlewareInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class Test implements MiddlewareInterface
{
public function handle(ServerRequestInterface $request, $params)
{
die('OK');
}
}
Он реализует интерфейс
spoiler
namespace Engine\Core\Middleware;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
interface MiddlewareInterface
{
public function handle(ServerRequestInterface $request, $params);
}
Кратко о жизненном цикле
Предположим, я создал контроллер Для получения некой секретной информации о пользователе.
Параллельно я создал отдельный класс для проверки JWT в специальной папке с Middleware классами.
В конструкторе контроллера, я прописываю следующее:
public function __construct(DI $di)
{
$this->middleware->execute( Verification::class, []);
}
Далее
namespace App\Middleware;
use Engine\Core\Middleware\MiddlewareInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class Verification implements MiddlewareInterface
{
public function handle(ServerRequestInterface $request, $params)
{
die('Не прошёл проверку'); // die для демонстрации (защита от хейтеров)
}
}
Некоторые детали.
При регистрации классов Middleware, не происходит инициализация и создание объекта.
Инициализация происходит в момент вызова контроллера.
А вот основной класс, который занимается инициализацией Middleware
spoiler
namespace Engine\Core\Middleware;
class Middleware
{
private $container = [];
public function registration(string $class)
{
if (!$this->has($class)) {
$this->container[] = $class;
}
}
public function has(string $class): bool
{
return in_array($class, $this->container);
}
public function execute(string $class, $arg = [])
{
if ($this->has($class)) {
if (class_exists($class)) {
$ObjectMiddleware = new $class();
}
/** @var MiddlewareInterface $ObjectMiddleware */
$ObjectMiddleware->handle(new ServerRequest(), $arg);
}
}
}
Хоть отдалённо похоже на некое решение промежуточного ПО.