Symfony2でパラメーターを動的に設定しようとしています(parameters.yml
ファイルに静的に設定することはできません)。私のアプローチはEventListener
:を使用することです
namespace Acme\AcmeBundle\EventListener;
use Symfony\Component\DependencyInjection\Container;
class AcmeListener
{
private $container;
public function __construct(Container $container)
{
$this->container = $container;
}
public function onKernelRequest()
{
// Dynamically fetch $bar
$bar = fetch('foobar');
// Set parameter
$this->container->setParameter('foo', $bar);
}
}
そして、私のサービス定義はconfig.yml
次のようになります。
service:
kernel.listener.acme_listener:
class: Acme\AcmeBundle\EventListener\AcmeListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
arguments: [ '@service_container' ]
問題は、例外が発生することです。
LogicException:フリーズしたParameterBagでset()を呼び出すことができません。
この例外を回避するにはどうすればよいですか、またはパラメータを動的に設定する別の方法がありますか?
コンテナパラメータのルールは次のとおりです。
コンテナをコンパイルする前にのみパラメータを設定できます
問題を解決する方法は、コンテナに動的パラメータがあるとは考えられていないという前提で、ニーズによって異なります。
カスタムの動的な「オプション」サービスを作成し、それを他のサービスに挿入します。この方法で、データベース内のパラメーターを管理することもできます(wordpress wp_optionsなど)が、これを行うバンドルはわかりません。既存のサービス(メーラーなど)の場合は、コンフィギュレーターを使用できます。
ここでパラメータが変更されたときにキャッシュを無効にする簡単な方法なので、ページをリロードするとコンテナが再構築されます。パラメータが頻繁に変更されると、キャッシュが頻繁にリロードされるリスクがあり、負荷が大きい場合に問題になります。
2番目のオプションを選択した場合は、コンテナに入力する前にパラメータを設定する必要があるため、次のことができます。
ただし、オプション1(オプションサービスとコンフィギュレーター)をお勧めします。これは、コンテナーが動的パラメーターを持っているとは考えられていないためですが、任意のソースからのデータを使用するカスタム動的サービスコンフィギュレーターを使用できるためです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加