Comment puis-je définir dynamiquement un paramètre dans Symfony2?
Je suis en train de définir de façon dynamique un paramètre dans Symfony2 (que je ne peut pas de manière statique en parameters.yml
fichier). Mon approche est d'utiliser un 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);
}
}
Et ma définition de service dans config.yml
ressemble à ceci:
service:
kernel.listener.acme_listener:
class: Acme\AcmeBundle\EventListener\AcmeListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
arguments: [ '@service_container' ]
Le problème est que j'obtiens une exception:
LogicException: Impossible d'appeler set() sur une gelée de ParameterBag.
Comment puis-je contourner cette exception ou voyez-vous une autre façon de définir dynamiquement un paramètre?
OriginalL'auteur Gottlieb Notschnabel | 2014-04-18
Vous devez vous connecter pour publier un commentaire.
Le conteneur des paramètres de la règle est que:
Comment remédier à ce problème dépend de vos besoins, avec la prémisse que le conteneur n'est pas pensé pour avoir les paramètres de la dynamique.
vous créer une dynamique personnalisé "options" du service et de l'injecter dans d'autres services, de cette façon, vous pouvez également gérer vos paramètres dans la base de données (comme wordpress wp_options), mais je n'en connais un paquet qui font cela. Pour les services existants (ex. mailer) vous pouvez utiliser les configurateurs.
invalider le cache lorsque les paramètres de changements voici une méthode facile ainsi, lorsque vous rechargez la page, le conteneur est reconstruit. Si les paramètres changent fréquemment risques pour recharger le cache fréquemment et cela devient un problème si vous avez de grandes charges.
si vous choisissez la deuxième option, vous devez définir les paramètres avant de elle est remplie dans le récipient, de sorte que vous pouvez:
Je suggère, cependant, l'option 1 (options de service et les configurateurs) parce que (je le répète) le conteneur n'est pas pensé pour avoir les paramètres de la dynamique, mais il offre la possibilité d'avoir personnalisé le service dynamique configurateurs que l'utilisation de données à partir de n'importe quelle source.
OriginalL'auteur Marino Di Clemente
J'ai eu le problème sur une liste d'Url commençant par
%base_url%
quand j'ai voulu faire un système de basculement.J'ai enfin remplacé
%base_url%
par#base_url#
et a fait un manuel des espaces réservés résolution dans un service.OriginalL'auteur Alain Tiemblo
Je pense qu'on peut ajouter des paramètres comme de simples fonctions de classe à un service.
C'est ma fonction de contrôleur.
C'est mon service
OriginalL'auteur vimuth