Как реализовать Slim, как механизм промежуточного программного обеспечения
Я решил реализовать свой собственный небольшой фреймворк для реализации таких вещей, как внедрение зависимостей и т. Д.
Теперь я застрял в своей реализации промежуточного программного обеспечения. Я могу добавить промежуточное программное обеспечение к маршруту, но мне интересно, насколько тонкими являются петли в подключенном промежуточном программном обеспечении.
Я хотел бы сделать это тонким способом, чтобы в каждом промежуточном программном обеспечении я мог возвращать запрос, ответ или следующее промежуточное программное обеспечение. Но как мне перебирать связанное промежуточное ПО?
Вот мой стек, я хочу продолжить
class MiddlewareStack
{
private $stack;
public function addMiddleware(Middleware $middleware)
{
$this->stack[] = $middleware;
}
public function processMiddleware(Request $request, Response $response)
{
}
}
и это интерфейс промежуточного программного обеспечения
public function __invoke(Request $request, Response $response, $next);
я бы хотел
return $next($request,$response);
в моих промежуточных классах или просто ответ или запрос.
Вот как можно создать промежуточное программное обеспечение, вызываемое в slim.
1 ответ
Slim 3 сначала добавляет себя в стек, который является Slim\App#__invoke()
который выполняет маршрут.
Затем, когда вы добавляете промежуточное программное обеспечение, оно делает следующее: (перед этим тонкий обертка вызывает (анонимная функция /invokable класс) внутри DeferredCallable
который помогает выполнять как функцию, так и класс в равной степени (см. Slim\App#add()
).
protected function addMiddleware(callable $callable) // $callable is a DeferredCallable
{
$next = $this->stack->top(); // when it the first middleware this would be the route execution
$this->stack[] = function (ServerRequestInterface $req, ResponseInterface $res) use ($callable, $next) {
$result = call_user_func($callable, $req, $res, $next);
return $result;
};
}
(Это всего лишь простой код, полный код см.: Slim\MiddlewareAwareTrait#addMiddleware()
)
Таким образом, промежуточное программное обеспечение, находящееся сверху стека, выполняет и другое промежуточное программное обеспечение, поскольку оно предоставляется в следующем методе.
Затем, когда вы захотите запустить промежуточное программное обеспечение, получите промежуточное программное обеспечение, находящееся сверху стека, и выполните его.
$start = $this->stack->top();
$resp = $start($req, $res);
// $resp is now the final response.
(увидеть Slim\MiddlewareAwareTrait#callMiddlewareStack()
)