PHP: ПО промежуточного слоя для исходящих сообщений PSR-15, изменение ответа с помощью ПО промежуточного слоя? - PullRequest
0 голосов
/ 30 мая 2020

Для нового проекта я хотел бы использовать промежуточное ПО для работы с входящими запросами, а затем с исходящими ответами.

Я немного запутался и растерялся в том, как этого добиться, придерживаясь при этом PSR-15. Каждое изображение, которое я нашел, показывает приложение как « onion », где промежуточное программное обеспечение действует как уровни, через которые проходят запрос и ответ . ( Двойной проход )

запрос -> промежуточное ПО -> обработчик -> промежуточное ПО -> ответ

Но текущий действительный PSR-15 MiddlewareInterface требует RequestInterface и возвращает ResponseInterface. Мне кажется, что «луковица» разрезана пополам:

запрос -> промежуточное ПО -> обработчик -> ответ

вопрос: Как я могу получить sh и изменить ответ через стек (промежуточного программного обеспечения?), если MiddlewareInterface требует запроса ?

I собрал вместе быстрый и чрезвычайно простой тестовый проект , чтобы показать, чего я пытаюсь достичь. Вот «сердце» приложения:

// bootstrap/app.php

$request = Factory::createRequest();

// Simple Routes... just for the test
$router = new Router([
    '/' => [CampaignController::class, 'show'],
    // .... route definitions ...
]);

// Match the incoming request to a handler
$handler = $router->match($request);

// Inbound Middlewares, these are PSR-15 conform
$inbound_middlewares = [
    new Alpha, // e.g. Check CSRF etc...
    new Bravo,
    new Charlie,
];

// Dispatch the request to a handler through the inbound middleware stack
$handler_response = Stack::pipe($request)->to($handler)->through($inbound_middlewares);

// Outbound Middlewares, these are NOT PSR-15 conform...
$outbound_middlewares = [
    new Delta, // e.g. minify HTML etc...
    new Foxtrot,
    new Golf,
];
// Pipe the Handler Response through the outbound middleware Stack
$server_response = Stack::pipe($handler_response)->through($outbound_middlewares);

// Emit the generated response back to the client
$emitter = Factory::createResponseEmitter();
$emitter->emit($server_response);

Я просмотрел код Laravel и других решений, но не смог найти, как они работают, или изменить ответ.

Может быть, я совершенно не в своем мышлении, или я просто не полностью понял концепцию ... Обычно я работаю с Laravel, поэтому эти концепции «нижнего» уровня для меня новы.

Изменить: Уточнение: Мое тестовое приложение работает, но мне интересно, «правильный» ли это подход.

...