Zend \ Http \ Client作为Zend Expressive的PSR-7中间件

时间:2016-06-20 09:10:48

标签: php zend-framework middleware psr-7 zend-expressive

我们应该如何将include_once class.login.php or require_once class.login.php (或其他模块)添加为PSR-7中间件?

我首先想到的是:

案例行动

  • 添加工厂
  • 注入Zend\Http\Client实例
  • 在行动中使用Zend\Http\Client实例,例如Zend\Http\Client

但我不确定这是否正确。它应该实施$client->request('GET');并提供MiddlewareInterface方法吗?

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

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

2 个答案:

答案 0 :(得分: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方法,因为表达式是如何调用中间件的。

您只使用中间件来操纵请求和响应。对于其他任何事情,你仍然可以像往常一样使用任何框架中的任何组件。

答案 1 :(得分:1)

如果我正确地阅读了您的问题,您只想在您的富有表现力的应用中使用Zend \ Http \ Client进行一些操作吗?

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

  1. 只需在需要时实例化/配置它,或
  2. 将其定义为您正在使用的任何DIC容器中的服务。
  3. 如果您打算在各种操作中使用类似配置的实例并且想要干掉一些初始配置,那么将其从容器中拉出是很好的。