PSR-15

Обсуждаем, как правильно строить приложения
Ответить
Auramel
Сообщения: 70
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

PSR-15

Сообщение Auramel » 2018.04.17, 19:46

И вот дошел до этого самого 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, а я не бум-бум совсем.

Аватара пользователя
ElisDN
Сообщения: 4942
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: PSR-15

Сообщение 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().

zelenin
Сообщения: 10456
Зарегистрирован: 2013.04.20, 11:30

Re: PSR-15

Сообщение 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)

Auramel
Сообщения: 70
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Re: PSR-15

Сообщение 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)
    {
    }
}

Auramel
Сообщения: 70
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Re: PSR-15

Сообщение Auramel » 2018.04.17, 21:41

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 попытался мне объяснить, постараюсь оправдать его усилия

zelenin
Сообщения: 10456
Зарегистрирован: 2013.04.20, 11:30

Re: PSR-15

Сообщение 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) и в нем маленький экшн. Обычно.

Auramel
Сообщения: 70
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Re: PSR-15

Сообщение Auramel » 2018.04.17, 22:16

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) и в нем маленький экшн. Обычно.
вот дичайшая дичь получается :D спасибо большое!
Вам всего доброго, хорошего настроения и здоровья ©

Auramel
Сообщения: 70
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Re: PSR-15

Сообщение Auramel » 2018.04.22, 23:19

Коллеги, извиняюсь за свою тупость. Выдалось время немного разобрать эту дичь. Вот, что получилось:

Код: Выделить всё


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? Как это обосновывается?

zelenin
Сообщения: 10456
Зарегистрирован: 2013.04.20, 11:30

Re: PSR-15

Сообщение zelenin » 2018.04.22, 23:46

не вижу смысла в этом коде.
Передавать action не надо.

Auramel
Сообщения: 70
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Re: PSR-15

Сообщение Auramel » 2018.04.23, 00:04

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, вообще все устаканилось. :D

Ответить