0

我们应该如何添加Zend\Http\Client(或其他模块)作为 PSR-7 中间件?

首先我认为是:

案例行动

  • 添加工厂
  • 注入Zend\Http\Client实例
  • Zend\Http\Client在 Action 中使用实例,例如$client->request('GET');

但我不确定这是否正确。它应该实现MiddlewareInterface并提供一种__invoke方法吗?

编辑:感谢@xtreamwayz 和@timdev https://stackoverflow.com/a/37928824/3411766 https://stackoverflow.com/a/37934597/3411766

所以我会按原样使用客户端。正如@timdex 通过工厂提到的那样,通过容器-> 获取它。谢谢两个=)

4

2 回答 2

1

如果我正确阅读了您的问题,您只是想在表达应用程序的某些操作中使用 Zend\Http\Client 吗?

如果是这种情况,您就会对中间件概念感到困惑。您不会将 HTTP 客户端用作中间件,因为它不是中间件,也不能充当中间件。它只是一个客户端对象。如果您想在某些操作中使用 HTTP 客户端,您可以:

  1. 只需在需要时实例化/配置它,或者
  2. 在您使用的任何 DIC 容器中将其定义为服务。

如果您计划在各种操作中使用类似配置的实例并希望干燥一些初始配置,那么从容器中提取它是很好的。

于 2016-06-21T02:23:14.140 回答
1

你不需要 Zend\Http\Client。调用中间件时会注入包含所有数据的请求。一个 zend-expressive 动作中间件可能看起来像这样:

<?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 调用中间件的方式。

You only use middleware to manipulate the request and response. For anything else you can still use any component from any framework as you always did.

于 2016-06-20T17:53:07.473 回答