PSR-15
PSR-15
И вот дошел до этого самого https://www.php-fig.org/psr/psr-15/. Перечитав несколько раз документацию я понял, что ничего не понял... Загуглил, смотрел примеры и че-то совсем уже крыша поехала...
Я так понял, что, если раньше мы делали для middleware в том же Slim __invoke(), то теперь надо process и, вместо Response, у нас RequestHandlerInterface (что он делает? зачем он?), у которого должен быть реализован метод handle(). И вот теперь вообще запутался... Зачем так сделали? Смотрел на zend strategility (как-то так) и совсем с ума сошел... Еще новое слово (для меня) Pipeline. Более менее Дмитрий Елисеев объяснил на эту тему в своем видео PSR-7 микро-фреймворк. Я был бы очень благодарен тому, кто сможет как-то разжевать эту новую дичь (psr-15) (лучше всего на каком-нибудь примере).
P.s. Тим лид дал задачу - изучить этот psr-15, а я не бум-бум совсем.
Я так понял, что, если раньше мы делали для middleware в том же Slim __invoke(), то теперь надо process и, вместо Response, у нас RequestHandlerInterface (что он делает? зачем он?), у которого должен быть реализован метод handle(). И вот теперь вообще запутался... Зачем так сделали? Смотрел на zend strategility (как-то так) и совсем с ума сошел... Еще новое слово (для меня) Pipeline. Более менее Дмитрий Елисеев объяснил на эту тему в своем видео PSR-7 микро-фреймворк. Я был бы очень благодарен тому, кто сможет как-то разжевать эту новую дичь (psr-15) (лучше всего на каком-нибудь примере).
P.s. Тим лид дал задачу - изучить этот psr-15, а я не бум-бум совсем.
Re: PSR-15
Было так:
Стало так:
Всего лишь добавили интерфейсы, заменив __invoke() на process() и handle().
Код: Выделить всё
class CredentialsMiddleware
{
public function __invoke(ServerRequestInterface $request, callable $next): ResponseInterface
{
return $next($request)
->withHeader('X-Developer', 'ElisDN');
}
}
Код: Выделить всё
class CredentialsMiddleware implements MiddlewareInterface
{
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
return $handler->handle($request)
->withHeader('X-Developer', 'ElisDN');
}
}
Re: PSR-15
прочли это?
https://www.php-fig.org/psr/psr-15/meta/
https://docs.zendframework.com/zend-exp ... /features/
У нас есть request извне. Принимает и обрабатывает его, возвращая Response, Request Handler. Тут все понятно. В простейшем случае Request Handler это обычный экшн.
Либо может быть более навороченный вариант - Pipeline (трубопровод). В него поступает реквест, дальше он пропускает его сквозь цепочку мидлварей, по пути заносит реквест в экшн, и опять же возвращает респонс.
По сравнению со слим ничего не поменялось, кроме сигнатур интерфейсов (см. мету к psr-15)
https://www.php-fig.org/psr/psr-15/meta/
https://docs.zendframework.com/zend-exp ... /features/
У нас есть request извне. Принимает и обрабатывает его, возвращая Response, Request Handler. Тут все понятно. В простейшем случае Request Handler это обычный экшн.
Либо может быть более навороченный вариант - Pipeline (трубопровод). В него поступает реквест, дальше он пропускает его сквозь цепочку мидлварей, по пути заносит реквест в экшн, и опять же возвращает респонс.
По сравнению со слим ничего не поменялось, кроме сигнатур интерфейсов (см. мету к psr-15)
Re: PSR-15
Если я правильно Вас понял (про простой случай и action), то должно быть типа так:zelenin писал(а): ↑2018.04.17, 21:16 прочли это?
https://www.php-fig.org/psr/psr-15/meta/
https://docs.zendframework.com/zend-exp ... /features/
У нас есть request извне. Принимает и обрабатывает его, возвращая Response, Request Handler. Тут все понятно. В простейшем случае Request Handler это обычный экшн.
Либо может быть более навороченный вариант - Pipeline (трубопровод). В него поступает реквест, дальше он пропускает его сквозь цепочку мидлварей, по пути заносит реквест в экшн, и опять же возвращает респонс.
По сравнению со слим ничего не поменялось, кроме сигнатур интерфейсов (см. мету к psr-15)
Код: Выделить всё
class HelloAction implements RequestHandler
{
public function handle($request)
{
}
}
Re: PSR-15
Большое спасибо! Эту дичь я понял. Самая большая путаница в голове пошла из-за Request Handler. zelenin попытался мне объяснить, постараюсь оправдать его усилияElisDN писал(а): ↑2018.04.17, 21:08 Было так:
Стало так:Код: Выделить всё
class CredentialsMiddleware { public function __invoke(ServerRequestInterface $request, callable $next): ResponseInterface { return $next($request) ->withHeader('X-Developer', 'ElisDN'); } }
Всего лишь добавили интерфейсы, заменив __invoke() на process() и handle().Код: Выделить всё
class CredentialsMiddleware implements MiddlewareInterface { public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { return $handler->handle($request) ->withHeader('X-Developer', 'ElisDN'); } }
Re: PSR-15
да, верно. ну в рамках фреймворка у нас несколько хэндлеров - один большой (Application/MiddlewarePipe) и в нем маленький экшн. Обычно.Auramel писал(а): ↑2018.04.17, 21:37Если я правильно Вас понял (про простой случай и action), то должно быть типа так:zelenin писал(а): ↑2018.04.17, 21:16 прочли это?
https://www.php-fig.org/psr/psr-15/meta/
https://docs.zendframework.com/zend-exp ... /features/
У нас есть request извне. Принимает и обрабатывает его, возвращая Response, Request Handler. Тут все понятно. В простейшем случае Request Handler это обычный экшн.
Либо может быть более навороченный вариант - Pipeline (трубопровод). В него поступает реквест, дальше он пропускает его сквозь цепочку мидлварей, по пути заносит реквест в экшн, и опять же возвращает респонс.
По сравнению со слим ничего не поменялось, кроме сигнатур интерфейсов (см. мету к psr-15)Код: Выделить всё
class HelloAction implements RequestHandler { public function handle($request) { } }
Re: PSR-15
вот дичайшая дичь получаетсяzelenin писал(а): ↑2018.04.17, 22:04да, верно. ну в рамках фреймворка у нас несколько хэндлеров - один большой (Application/MiddlewarePipe) и в нем маленький экшн. Обычно.Auramel писал(а): ↑2018.04.17, 21:37Если я правильно Вас понял (про простой случай и action), то должно быть типа так:zelenin писал(а): ↑2018.04.17, 21:16 прочли это?
https://www.php-fig.org/psr/psr-15/meta/
https://docs.zendframework.com/zend-exp ... /features/
У нас есть request извне. Принимает и обрабатывает его, возвращая Response, Request Handler. Тут все понятно. В простейшем случае Request Handler это обычный экшн.
Либо может быть более навороченный вариант - Pipeline (трубопровод). В него поступает реквест, дальше он пропускает его сквозь цепочку мидлварей, по пути заносит реквест в экшн, и опять же возвращает респонс.
По сравнению со слим ничего не поменялось, кроме сигнатур интерфейсов (см. мету к psr-15)Код: Выделить всё
class HelloAction implements RequestHandler { public function handle($request) { } }
![Очень доволен :D](./images/smilies/icon_e_biggrin.gif)
Вам всего доброго, хорошего настроения и здоровья ©
Re: PSR-15
Коллеги, извиняюсь за свою тупость. Выдалось время немного разобрать эту дичь. Вот, что получилось:
И теперь вопрос: правильно ли все? если да - почему в middleware надо передавать $action? Как это обосновывается?
Код: Выделить всё
class AMiddleware implements \Psr\Http\Server\MiddlewareInterface
{
public function process(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Server\RequestHandlerInterface $handler): \Psr\Http\Message\ResponseInterface
{
return new \Zend\Diactoros\Response();
}
}
class BMiddleware implements \Psr\Http\Server\MiddlewareInterface
{
public function process(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Server\RequestHandlerInterface $handler): \Psr\Http\Message\ResponseInterface
{
return new \Zend\Diactoros\Response();
}
}
class HelloAction implements \Psr\Http\Server\RequestHandlerInterface
{
public function handle(\Psr\Http\Message\ServerRequestInterface $request): \Psr\Http\Message\ResponseInterface
{
return new \Zend\Diactoros\Response();
}
}
$request = \Zend\Diactoros\ServerRequestFactory::fromGlobals();
$a = new AMiddleware();
$b = new BMiddleware();
$action = new HelloAction();
$a->process($request, $action);
$b->process($request, $action);
Re: PSR-15
не вижу смысла в этом коде.
Передавать action не надо.
Передавать action не надо.
Re: PSR-15
Спасибо за активность! Я реально не мог понять Pipeline, а не сам PSR.
Код: Выделить всё
$request = \Zend\Diactoros\ServerRequestFactory::fromGlobals();
class HelloAction implements \Psr\Http\Server\RequestHandlerInterface
{
public function handle(\Psr\Http\Message\ServerRequestInterface $request): \Psr\Http\Message\ResponseInterface
{
print '3';
return new \Zend\Diactoros\Response();
}
}
class A implements \Psr\Http\Server\MiddlewareInterface
{
public function process(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Server\RequestHandlerInterface $handler): \Psr\Http\Message\ResponseInterface
{
print '1';
return $handler->handle($request);
}
}
class B implements \Psr\Http\Server\MiddlewareInterface
{
public function process(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Server\RequestHandlerInterface $handler): \Psr\Http\Message\ResponseInterface
{
print '2';
return $handler->handle($request);
}
}
class C implements \Psr\Http\Server\MiddlewareInterface
{
public function process(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Server\RequestHandlerInterface $handler): \Psr\Http\Message\ResponseInterface
{
print '4';
return new \Zend\Diactoros\Response();
}
}
$pipeline = new \Zend\Stratigility\MiddlewarePipe();
$pipeline->pipe(new A());
$pipeline->pipe(new B());
$pipeline->pipe(new C());
$pipeline->process($request, new HelloAction());
![Очень доволен :D](./images/smilies/icon_e_biggrin.gif)