Для нового проекта я хотел бы использовать промежуточное ПО для работы с входящими запросами, а затем с исходящими ответами.
Я немного запутался и растерялся в том, как этого добиться, придерживаясь при этом 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, поэтому эти концепции «нижнего» уровня для меня новы.
Изменить: Уточнение: Мое тестовое приложение работает, но мне интересно, «правильный» ли это подход.