Wie kann ich dynamisch die Einstellung eines Parameters in Symfony2?
Ich versuche, die dynamisch die Einstellung eines Parameters in Symfony2 (das kann ich nicht statisch festgelegt, in meinem parameters.yml
- Datei). Mein Ansatz ist die Verwendung einer 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);
}
}
Und meine service-definition in config.yml
sieht wie folgt aus:
service:
kernel.listener.acme_listener:
class: Acme\AcmeBundle\EventListener\AcmeListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
arguments: [ '@service_container' ]
Das problem ist, ich bekomme eine exception:
LogicException: Unmöglich, den Aufruf von set() auf einem gefrorenen ParameterBag.
Wie kann ich arbeiten, um dieses Ausnahme-oder siehst du eine andere Möglichkeit dynamisch einen parameter?
InformationsquelleAutor Gottlieb Notschnabel | 2014-04-18
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Container-Parameter-Regel ist, dass:
Wie man das problem beheben, hängt von Ihren Bedürfnissen, mit der Prämisse, dass der container nicht gedacht, um dynamische Parameter.
erstellen Sie benutzerdefinierte dynamische "Optionen" service und injizieren es in den anderen Leistungen, auf diese Weise können Sie auch verwalten Sie Ihre Parameter in der Datenbank (wie wordpress wp_options), aber ich weiß nicht, ein Bündel, die dies tun. Für bestehende services (ex. mailer) Sie können Konfiguratoren.
den cache ungültig, wenn Parameter änderungen hier eine einfache Methode also, wenn Sie die Seite neu laden, werden die container neu erstellt wird. Wenn Sie die Parameter ändern sich Häufig Risiken neu zu laden, den cache Häufig, und dies wird zu einem problem, wenn Sie große Lasten.
wenn Sie die zweite option wählen, müssen Sie die Parameter einstellen, bevor es gefüllt ist, in den Behälter, so können Sie:
Schlage ich vor, aber option 1 (Optionen service und Konfiguratoren), weil (ich wiederhole) der container ist nicht gedacht, um dynamische Parameter, aber es bietet die Möglichkeit, benutzerdefinierte dynamische service-Konfiguratoren, die die Verwendung von Daten aus jeder beliebigen Quelle.
Hatte ich das problem auf einer Liste von URLs beginnend mit
%base_url%
wenn ich wollte ein failover-system.Ich schließlich ersetzt
%base_url%
durch#base_url#
und haben einen manuellen Platzhalter-Auflösung im service.Ich denke, wir können noch Parameter als einfache Klasse von Funktionen zu einem service.
Dies ist mein controller-Funktion.
Dies ist mein service