0 レビュー
2 回答
php-symfonyセッションにバッグを追加する方法
symfonyセッションにバッグを追加したい。
これはコンパイラパスで行います:
public function process(ContainerBuilder $container)
{
$bag = new AttributeBag("my_session_attributes");
$container->getDefinition("session")
->addMethodCall("registerBag", [$bag]);
}
しかし、次のメッセージで例外が発生します:
パラメータがオブジェクトまたは リソース。
トレーススタックは次のとおりです:
- XmlDumper.phpの379行目
- XmlDumper.php行328のXmlDumper::phpToXml(object(AttributeBag))で
- XmlDumper-> convertParameters(array(object(AttributeBag))、'argument'、object(DOMElement))のXmlDumper.php行94
- at XmlDumper-> addMethodCalls(array(array('registerBag'、array(object(AttributeBag))))、object(DOMElement))in XmlDumper.php 183行目
- XmlDumper-> addService(object(Definition)、'session'、object(DOMElement))のXmlDumper.php行272
- XmlDumper.phpの52行目のXmlDumper->addServices(object(DOMElement))で
- ContainerBuilderDebugDumpPass.phpの34行目のXmlDumper->dump()で
- at ContainerBuilderDebugDumpPass-> process(object(ContainerBuilder))in Compiler.php104行目
- ContainerBuilder.phpの598行目のCompiler->compile(object(ContainerBuilder))で
- ContainerBuilder-> compile()のKernel.php行514
- Kernel.phpの133行目のKernel->initializeContainer()で
- Kernel.phpの182行目のKernel->boot()で
- app_dev.phpの29行目のKernel->handle(object(Request))で
サービス定義でオブジェクト引数を渡すことができない場合、どのように新しいバッグを追加する必要がありますか?
わからない
0
レビュー
答え :
解決策:
わかりました。質問を投稿した直後に、回避策を検討するというアイデアがありましたが、うまくいきました。
AttributeBagもサービスとして登録する必要があります:
public function process(ContainerBuilder $container)
{
$bagDefinition = new Definition();
$bagDefinition->setClass(AttributeBag::class);
$bagDefinition->addArgument("my_session_attributes");
$bagDefinition->addMethodCall("setName", ["my_session_attributes"]);
$bagDefinition->setPublic(false);
$container->setDefinition("my_session_attributes_service", $bagDefinition);
$container->getDefinition("session")
->addMethodCall("registerBag", [new Reference("my_session_attributes_service")]);
}
わからない
0
レビュー
答え :
解決策:
この問題はドキュメントでは明確ではありません。あなたの例は少し役に立ちましたが、symfonyセッションにバッグを追加するよりクリーンな方法があると思います。これが私がしたことです(symfony 4 +)
バッグクラスを追加します。たとえば、AttributeBagクラスを拡張できます
namespace App\Tracking;
use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
class TrackingBag extends AttributeBag
{
public function __construct(string $storageKey = 'trackings')
{
parent::__construct($storageKey);
$this->setName($storageKey);
}
}
次に、CompilerPassを追加します
public function process(ContainerBuilder $container)
{
$container->getDefinition("session")->addMethodCall(
"registerBag",
[new Reference('App\\Tracking\\TrackingBag')]
);
}
それなら、小枝でそのように使うことができます
{{ app.session.bag('trackings').all }}
私はまだよりクリーンな方法があると信じていますが、これが私のために働いた唯一の方法でした。
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。