Страница 1 из 1
PSR-15
Добавлено: 2018.04.17, 19:46
Auramel
И вот дошел до этого самого
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, а я не бум-бум совсем.
Re: PSR-15
Добавлено: 2018.04.17, 21:08
ElisDN
Было так:
Код: Выделить всё
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');
}
}
Всего лишь добавили интерфейсы, заменив __invoke() на process() и handle().
Re: PSR-15
Добавлено: 2018.04.17, 21:16
zelenin
прочли это?
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
Добавлено: 2018.04.17, 21:37
Auramel
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)
Если я правильно Вас понял (про простой случай и action), то должно быть типа так:
Код: Выделить всё
class HelloAction implements RequestHandler
{
public function handle($request)
{
}
}
Re: PSR-15
Добавлено: 2018.04.17, 21:41
Auramel
ElisDN писал(а): ↑2018.04.17, 21:08
Было так:
Код: Выделить всё
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');
}
}
Всего лишь добавили интерфейсы, заменив __invoke() на process() и handle().
Большое спасибо! Эту дичь я понял. Самая большая путаница в голове пошла из-за Request Handler.
zelenin попытался мне объяснить, постараюсь оправдать его усилия
Re: PSR-15
Добавлено: 2018.04.17, 22:04
zelenin
Auramel писал(а): ↑2018.04.17, 21:37
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)
Если я правильно Вас понял (про простой случай и action), то должно быть типа так:
Код: Выделить всё
class HelloAction implements RequestHandler
{
public function handle($request)
{
}
}
да, верно. ну в рамках фреймворка у нас несколько хэндлеров - один большой (Application/MiddlewarePipe) и в нем маленький экшн. Обычно.
Re: PSR-15
Добавлено: 2018.04.17, 22:16
Auramel
zelenin писал(а): ↑2018.04.17, 22:04
Auramel писал(а): ↑2018.04.17, 21:37
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)
Если я правильно Вас понял (про простой случай и action), то должно быть типа так:
Код: Выделить всё
class HelloAction implements RequestHandler
{
public function handle($request)
{
}
}
да, верно. ну в рамках фреймворка у нас несколько хэндлеров - один большой (Application/MiddlewarePipe) и в нем маленький экшн. Обычно.
вот дичайшая дичь получается
спасибо большое!
Вам всего доброго, хорошего настроения и здоровья ©
Re: PSR-15
Добавлено: 2018.04.22, 23:19
Auramel
Коллеги, извиняюсь за свою тупость. Выдалось время немного разобрать эту дичь. Вот, что получилось:
Код: Выделить всё
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);
И теперь вопрос: правильно ли все? если да - почему в middleware надо передавать $action? Как это обосновывается?
Re: PSR-15
Добавлено: 2018.04.22, 23:46
zelenin
не вижу смысла в этом коде.
Передавать action не надо.
Re: PSR-15
Добавлено: 2018.04.23, 00:04
Auramel
zelenin писал(а): ↑2018.04.22, 23:46
не вижу смысла в этом коде.
Передавать action не надо.
Спасибо за активность! Я реально не мог понять 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());
Рабочий пример с использованием zend. Вроде, правильно. Неправильно начал знакомство с PSR-15 (полез в него после видео от Дмитрия Елисеева). А в голове все вертелось слово Pipeline (ибо новое). В итоге, думал, что это ОБЯЗАНО работать вместе. Немного побомбил различными способами и сразу все стало понятно + глянул исходники Zend Pipeline, вообще все устаканилось.