symfony2セッションを使おうとしています。
$session = $this->getRequest()->getSession();
$session->set('token','value');
これは機能します。しかし、セッションで名前空間を使用したいと思います。ドキュメントによると
class NamespacedAttributeBag
その機能を提供しますが、私はそれを実装する方法を理解できません
config.ymlを開き、インポート後に以下を追加します。
parameters:
session.attribute_bag.class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag
次のようになります。
imports:
- { resource: parameters.yml }
- { resource: security.yml }
parameters:
session.attribute_bag.class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag
framework:
# ...
セッションサービスを再定義し、属性バッグのサービスも定義する必要があります(デフォルトの実装を確認するsession.attribute_bag
と、このサービスにはクラス属性しかないことがわかります)。
そして、そこに再定義されたセッションサービスに新しいサービスを注入します
services:
session:
class: Symfony\Component\HttpFoundation\Session\Session
arguments:
- @session.storage
- @your.session.attribute_bag #service id is defined below
- @session.flash_bag
your.session.attribute_bag:
class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag
Symfony2の外部でHTTPFoundationコンポーネントを使用することも可能であるため、NamespacedUserBagsを実装する方法は次のとおりです。
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag;
$session = new Session();
//first bag
$myAttributeBag = new NamespacedAttributeBag('<your_storage_key_1>');
$myAttributeBag->setName('<your_tag_name_1>');
$session->registerBag($myAttributeBag);
//second bag
$myAttributeBag = new NamespacedAttributeBag('<your_storage_key_2>');
$myAttributeBag->setName('<your_tag_name_2>');
$session->registerBag($myAttributeBag);
$session->start();
必要な数のバッグを登録しますが、セッションを開始する前に必ず登録してください。getBag()を使用してバッグを切り替えることができるようになりました。
$activeBag = $session->getBag('<your_tag_name>');
そして、典型的な方法で名前空間付きバッグにアクセスします:
$activeBag->set('tokens/a', 'adsf82983asd');
$activeBag->set('tokens/b', 'daslfl232l3k');
print_r($activeBag->get('tokens'));
Symfony 3以降、session.attribute_bag.class
パラメーターのオーバーライドは機能しなくなりました。
しばらく髪を引っ張った後に適用した解決策は、コンパイラパスを使用してsession.attribute_bag
サービスクラスをオーバーライドすることです。
カーネルで直接実行しましたが、外部コンパイラパスも同じように機能します。
SF4カーネル
<?php
// src/Kernel.php
namespace App;
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag;
class Kernel extends BaseKernel implements CompilerPassInterface
{
use MicroKernelTrait;
// ...
public function process(ContainerBuilder $container)
{
$container->getDefinition('session.attribute_bag')->setClass(NamespacedAttributeBag::class);
}
}
Symfony 4(およびFlex)では、次の設定を使用して使用しますNamespacedAttributeBag
。
# config/services.yaml
services:
session.attribute_bag:
class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag
# ...