Wie in anderen Antworten vorgeschlagen contact_email
, parameters.yml
ist die Lösung des Verschiebens von zwar einfach, kann jedoch Ihre Parameterdatei leicht überladen, wenn Sie mit vielen Bundles oder verschachtelten Konfigurationsblöcken arbeiten.
- Zuerst werde ich die Frage streng beantworten.
- Später werde ich einen Ansatz geben, um diese Konfigurationen von Diensten abzurufen, ohne jemals einen gemeinsamen Raum als Parameter zu durchlaufen.
ERSTER ANSATZ: Getrennter Konfigurationsblock, der als Parameter abgerufen wird
Mit einer Erweiterung ( mehr zu Erweiterungen hier ) können Sie diese einfach in verschiedene Blöcke in der "trennen" config.yml
und diese dann als Parameter einfügen, der vom Controller abgerufen werden kann.
DependencyInjection
Schreiben Sie in Ihrer Erweiterungsklasse im Verzeichnis Folgendes:
class MyNiceProjectExtension extends Extension
{
public function load( array $configs, ContainerBuilder $container )
{
// The next 2 lines are pretty common to all Extension templates.
$configuration = new Configuration();
$processedConfig = $this->processConfiguration( $configuration, $configs );
// This is the KEY TO YOUR ANSWER
$container->setParameter( 'my_nice_project.contact_email', $processedConfig[ 'contact_email' ] );
// Other stuff like loading services.yml
}
Dann in Ihrer config.yml, config_dev.yml und so können Sie einstellen
my_nice_project:
contact_email: someone@example.com
Um dies config.yml
in Ihrem verarbeiten zu können, MyNiceBundleExtension
benötigen Sie außerdem eine Configuration
Klasse im selben Namespace:
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'my_nice_project' );
$rootNode->children()->scalarNode( 'contact_email' )->end();
return $treeBuilder;
}
}
Dann können Sie die Konfiguration von Ihrem Controller erhalten, wie Sie es in Ihrer ursprünglichen Frage gewünscht haben, aber die Konfiguration parameters.yml
sauber halten und in den config.yml
getrennten Abschnitten einstellen :
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
ZWEITER ANSATZ: Separater Konfigurationsblock, der die Konfiguration in einen Dienst einfügt
Für Leser, die nach etwas Ähnlichem suchen, aber die Konfiguration von einem Dienst erhalten möchten, gibt es eine noch schönere Möglichkeit, die den gemeinsamen Raum der "Parameter" niemals überfüllt und nicht einmal container
an den Dienst übergeben werden muss (das Übergeben des gesamten Containers ist üblich vermeiden).
Dieser Trick oben "injiziert" immer noch in den Parameterraum Ihrer Konfiguration.
Trotzdem können Sie nach dem Laden Ihrer Definition des Dienstes einen Methodenaufruf wie beispielsweise hinzufügen setConfig()
, der diesen Block nur in den Dienst einfügt.
Zum Beispiel in der Erweiterungsklasse:
class MyNiceProjectExtension extends Extension
{
public function load( array $configs, ContainerBuilder $container )
{
$configuration = new Configuration();
$processedConfig = $this->processConfiguration( $configuration, $configs );
// Do not add a paramater now, just continue reading the services.
$loader = new YamlFileLoader( $container, new FileLocator( __DIR__ . '/../Resources/config' ) );
$loader->load( 'services.yml' );
// Once the services definition are read, get your service and add a method call to setConfig()
$sillyServiceDefintion = $container->getDefinition( 'my.niceproject.sillymanager' );
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'contact_email' ] ) );
}
}
Dann services.yml
definieren Sie in Ihrem Dienst Ihren Service wie gewohnt, ohne absolute Änderung:
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
Und dann SillyManager
fügen Sie in Ihrer Klasse einfach die Methode hinzu:
class SillyManager
{
private $contact_email;
public function setConfig( $newConfigContactEmail )
{
$this->contact_email = $newConfigContactEmail;
}
}
Beachten Sie, dass dies auch für Arrays anstelle von Skalarwerten funktioniert! Stellen Sie sich vor, Sie konfigurieren eine Kaninchenwarteschlange und benötigen Host, Benutzer und Kennwort:
my_nice_project:
amqp:
host: 192.168.33.55
user: guest
password: guest
Natürlich müssen Sie Ihren Baum ändern, aber dann können Sie Folgendes tun:
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );
und dann im Service tun:
class SillyManager
{
private $host;
private $user;
private $password;
public function setConfig( $config )
{
$this->host = $config[ 'host' ];
$this->user = $config[ 'user' ];
$this->password = $config[ 'password' ];
}
}
Hoffe das hilft!