Как получить запрос и сессию в контейнере? - PullRequest
0 голосов
/ 14 декабря 2018

Я изучаю 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));
}

, он возвращает Closure.

enter image description here

Я думаю, что запрос не инициализируется на этом шаге.

Моя задача - создать сервис для авторизации, который должен сохранять аутентифицированного пользователя в сеансе.

Подскажите, пожалуйста, как мне правильно получить запрос и экземпляры сеанса?

Может быть, я не понимаю, как работает Zend Expressive?

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Вы не можете получить session от ContainerInterface.

Сессия является частью жизненного цикла вашего запроса.Если вы используете 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.Требуется немного привыкнуть, поэтому я думаю, что все еще хорошо, чтобы ответить на него.

0 голосов
/ 14 декабря 2018

Мне неясно, какие у вас могут быть ограничения на службу авторизации, но, возможно, вы неправильно подходите к вещам.

Эта документация о промежуточном программном обеспечении для вложения с примером аутентификацииЧасть может быть полезна

Но, не зная специфики вашего проекта, вы можете узнать больше о сохранении сеанса в Zend Expressive здесь или взглянуть на адаптеры аутентификации в Zend Expressive здесь

...