14

symfony2セッションを使おうとしています。

    $session = $this->getRequest()->getSession();
    $session->set('token','value');

これは機能します。しかし、セッションで名前空間を使用したいと思います。ドキュメントによると

    class NamespacedAttributeBag 

その機能を提供しますが、私はそれを実装する方法を理解できません

4

5 に答える 5

15

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:
# ...
于 2012-11-06T11:51:31.120 に答える
9

セッションサービスを再定義し、属性バッグのサービスも定義する必要があります(デフォルトの実装を確認する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
于 2012-09-05T10:33:45.477 に答える
4

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'));
于 2014-11-02T16:23:15.610 に答える
2

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);
    }
}
于 2018-04-25T13:48:22.093 に答える
1

Symfony 4(およびFlex)では、次の設定を使用して使用しますNamespacedAttributeBag

# config/services.yaml
services:
  session.attribute_bag: 
    class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag
  # ...
于 2019-05-13T13:37:44.223 に答える