0

私は表現力豊かな禅を学び、工場についていくつか質問があります。

したがって、ミドルウェアでセッションを取得できます。

...
/** @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 を返します。

ここに画像の説明を入力

この段階ではリクエストは初期化されていないと思います。

私の仕事は、認証されたユーザーをセッションに保存する承認用のサービスを作成することです。

教えてください、どうすればリクエストとセッションのインスタンスを正しく取得できますか?

多分、私はzend表現がどのように機能するかを理解していませんか?

4

2 に答える 2

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 に答える