2016-06-20 1 views
0

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

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

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

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

Но им не уверен, если это будет правильно. Следует ли внедрить MiddlewareInterface и предоставить метод __invoke?

EDIT: благодаря @xtreamwayz и @timdev https://stackoverflow.com/a/37928824/3411766 https://stackoverflow.com/a/37934597/3411766

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

ответ

1

Вам не нужен Zend \ Http \ Client. Запрос со всеми его данными вводится при вызове промежуточного программного обеспечения. Зенд-выразительных действие промежуточного слоя может выглядеть следующим образом:

<?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, 
     ])); 
    } 
} 

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

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

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

1

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

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

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

Вытягивание его из контейнера является приятным, если вы планируете использовать аналогично сконфигурированные экземпляры в различных действиях и хотите СУХОЙ часть первоначальной конфигурации.

Смежные вопросы