0

我学习了zend expressive,我对工厂有一些疑问。

所以,我可以在中间件中获得一个会话:

...
/** @var Zend\Expressive\Session\LazySession $session */
$session = $request->getAttribute(SessionMiddleware::SESSION_ATTRIBUTE);
...

但是,如果我想创建一个具有会话依赖性的自定义服务,我需要将会话实例放入工厂。

class AuthServiceFactory
{
    public function __invoke(ContainerInterface $container): HttpAuthService
    {
        // get instance $userRepository
        // get instance $session

        return new HttpAuthService(
            $userRepository,
            $session
        );
    }
}

当我尝试从容器中获取请求实例时:

public function __invoke(ContainerInterface $container): HttpAuthService
{
    dd($container->get(\Psr\Http\Message\ServerRequestInterface::class));
}

它返回闭包。

在此处输入图像描述

我认为在这一步没有初始化请求。

我的任务是为授权提供服务,该服务应该将经过身份验证的用户保存到会话中。

请告诉我,如何正确获取请求和会话实例?

也许,我不明白zend expressive是如何工作的吗?

4

2 回答 2

1

我不清楚您可能对授权服务的限制,但也许您以错误的方式处理事情。

这份关于使用示例身份验证片嵌套中间件的文档可能会有所帮助

但不知道您的项目的细节,您可以在此处了解有关 zend expressive 中的会话持久性的更多信息,或者在此处查看zend expressive 上下文中的身份验证适配器

于 2018-12-14T04:24:56.803 回答
0

无法sessionContainerInterface. _

会话是您请求生命周期的一部分。如果您正在使用zend-expressive-session,您将能够从您的处理程序中获取会话,因为它将附加到Request通过

$request->getAttribute(SessionMiddleware::SESSION_ATTRIBUTE)

因此,如果您的服务需要使用会话,您需要从容器中注入它。基本上你应该有这样的东西:

class SomeService
{
    /** @var SessionInterface $session **/
    private $session;

    public function __construct(SomeDependency $dep) {
        //...
    }

    public function thatNeedsASession()
    {
        if (false === $this->session instanceof SessionInterface)
        {
            throw RuntimeException('Bro, inject that session thingy!');
        }

        //... use session here
    }

    public function setSession(SessionInterface $session) 
    {
        $this->session = $session;
    }
}

形成您的处理程序,然后适当地注入会话:

class SomeHandler
{
    /** @var SomeService $service **/
    private $service;

    public function __construct(SomeService $service)
    {
        $this->service = $service;
    }

    public function handle(ServerRequestInterface $request) : ResponseInterface
    {
        $session = $request->getAttribute(SessionMiddleware::SESSION_ATTRIBUTE);

        $this->service->setSession($session);

        // You're now able to properly use your service
        $this->service->thatNeedsASession();
    }
}

这当然是一个较老的问题,但我刚看到它,当我第一次进入 Expressive 时,我自己也有这个问题。需要一点时间来适应,所以我想还是回答它是件好事。

于 2019-03-14T14:53:58.010 回答