Rozwiązanie przeniesienia contact_emaildo parameters.ymljest łatwe, jak zaproponowano w innych odpowiedziach, ale może łatwo zaśmiecać plik parametrów, jeśli masz do czynienia z wieloma pakietami lub jeśli masz do czynienia z zagnieżdżonymi blokami konfiguracji.
- Najpierw odpowiem ściśle na pytanie.
- Później przedstawię podejście do pobierania tych konfiguracji z usług bez przechodzenia przez wspólną przestrzeń jako parametry.
PIERWSZE PODEJŚCIE: Oddzielny blok konfiguracji, otrzymując go jako parametr
Z przedłużeniem ( więcej o rozszerzeniach tutaj ) możesz to łatwo „rozdzielić” na różne bloki wconfig.yml a następnie wstrzyknąć jako parametr gettable ze sterownika.
Wewnątrz klasy Extension wewnątrz DependencyInjection katalogu napisz:
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
}
Następnie w config.yml, config_dev.yml i możesz ustawić
my_nice_project:
contact_email: someone@example.com
Aby móc przetworzyć to config.ymlw swoim wnętrzu MyNiceBundleExtension, potrzebujesz równieżConfiguration klasy w tej samej przestrzeni nazw:
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'my_nice_project' );
$rootNode->children()->scalarNode( 'contact_email' )->end();
return $treeBuilder;
}
}
Następnie możesz uzyskać konfigurację ze swojego kontrolera, tak jak chciałeś w swoim pierwotnym pytaniu, ale utrzymując parameters.ymlczystość i ustawiając ją wconfig.yml w oddzielnych sekcjach:
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
DRUGIE PODEJŚCIE: Oddzielny blok konfiguracji, wstrzykiwanie konfiguracji do usługi
Dla czytelników szukających czegoś podobnego, ale do uzyskania konfiguracji z usługi, istnieje jeszcze lepszy sposób, który nigdy nie zaśmieca wspólnej przestrzeni „parametrów”, a nawet nie potrzebuje container być przekazywany do usługi (przekazywanie całego kontenera jest praktyką uniknąć).
Ta sztuczka powyżej nadal „wstrzykuje” do przestrzeni parametrów twojej konfiguracji.
Niemniej jednak po załadowaniu definicji usługi można dodać wywołanie metody, na przykład setConfig()wstrzykuje ten blok tylko do usługi.
Na przykład w klasie Extension:
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' ] ) );
}
}
Następnie services.ymldefiniujesz swoją usługę jak zwykle, bez żadnych absolutnych zmian:
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
A następnie w swojej SillyManagerklasie po prostu dodaj metodę:
class SillyManager
{
private $contact_email;
public function setConfig( $newConfigContactEmail )
{
$this->contact_email = $newConfigContactEmail;
}
}
Zauważ, że działa to również dla tablic zamiast wartości skalarnych! Wyobraź sobie, że konfigurujesz kolejkę królika i potrzebujesz hosta, użytkownika i hasła:
my_nice_project:
amqp:
host: 192.168.33.55
user: guest
password: guest
Oczywiście musisz zmienić swoje Drzewo, ale możesz zrobić:
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );
a następnie w serwisie wykonaj:
class SillyManager
{
private $host;
private $user;
private $password;
public function setConfig( $config )
{
$this->host = $config[ 'host' ];
$this->user = $config[ 'user' ];
$this->password = $config[ 'password' ];
}
}
Mam nadzieję że to pomoże!