Rozwiązanie przeniesienia contact_email
do parameters.yml
jest ł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.yml
w 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.yml
czystość 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.yml
definiujesz swoją usługę jak zwykle, bez żadnych absolutnych zmian:
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
A następnie w swojej SillyManager
klasie 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!