Zend\Http\Client как промежуточное ПО PSR-7 для Zend Expressive

Как мы должны добавить Zend\Http\Client (или другие модули) в качестве промежуточного программного обеспечения PSR-7?

Сначала я подумал:

Дело действие

  • добавить завод
  • внедрить Zend\Http\Client экземпляр
  • использовать экземпляр Zend\Http\Client в действии, например $client->request('GET');

Но я не уверен, что это будет правильно. Должен ли он реализовать MiddlewareInterface и предоставить метод __invoke?

РЕДАКТИРОВАТЬ: благодаря @xtreamwayz и @timdev https://stackoverflow.com/a/37928824/3411766 https://stackoverflow.com/a/37934597/3411766

Так что я буду использовать клиент как есть. И, как упоминал @timdex, через factory, чтобы получить его с помощью container-> get. Спасибо обоим =)


person cottton    schedule 20.06.2016    source источник


Ответы (2)


Вам не нужен Zend\Http\Client. Запрос со всеми его данными вводится при вызове промежуточного программного обеспечения. Промежуточное ПО Zend-Expressive Action может выглядеть так:

<?php

namespace App\Action;

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Zend\Diactoros\Response\HtmlResponse;
use Zend\Expressive\Template\TemplateRendererInterface;

class ViewUserAction implements MiddlewareInterface
{
    private $template;

    private $userRepository;

    public function __construct(
        TemplateRendererInterface $template,
        UserRepository $userRepository
    ) {
        $this->template       = $template;
        $this->userRepository = $userRepository;
    }

    public function __invoke(Request $request, Response $response, callable $out = null)
    {
        $id   = (int) $request->getAttribute('id');
        $user = $this->userRepository->find($id);
        if (!$user) {
            return $out($request, $response->withStatus(404), 'Not found');
        }

        return new HtmlResponse($this->template->render('template', [
            'user' => $user,
        ]));
    }
}

Expressive внедряет объект запрос Zend-stratigility, который содержит все методы, необходимые для получения данных запроса.

Реализация MiddlewareInterface не является обязательной, но я обычно так и делаю. И да, ему нужен метод __invoke, так как именно так Expressive вызывает промежуточное ПО.

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

person xtreamwayz    schedule 20.06.2016

Если я правильно понимаю ваш вопрос, вы просто хотите использовать Zend\Http\Client в каком-то действии в своем выразительном приложении?

Если это так, вы запутались в концепции промежуточного программного обеспечения. Вы не стали бы использовать HTTP-клиент в качестве промежуточного ПО, так как это не промежуточное ПО и не действует как промежуточное ПО. Это просто клиентский объект. Если вы хотите использовать HTTP-клиент в каком-либо действии, вы можете:

  1. Просто создайте/настройте его, когда это необходимо, или
  2. Определите его как службу в любом контейнере DIC, который вы используете.

Извлекать его из контейнера удобно, если вы планируете использовать экземпляры с аналогичной конфигурацией в различных действиях и хотите СУШИТЬ некоторую первоначальную конфигурацию.

person timdev    schedule 21.06.2016