Как реализовать 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.

http://www.slimframework.com/docs/concepts/middleware.html

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())

Другие вопросы по тегам