Хоча рішення переміщення contact_email
до параметра parameters.yml
є простим, як це пропонується в інших відповідях, це може легко захаращувати файл ваших параметрів, якщо ви маєте справу з багатьма пакетами або якщо ви маєте справу з вкладеними блоками конфігурації.
- Спочатку я відповім строго на запитання.
- Пізніше я наведу підхід для отримання цих конфігурацій із служб, не переходячи через загальний простір як параметри.
ПЕРШИЙ ПІДХІД: відокремлений блок конфігурацій, отримуючи його як параметр
За допомогою розширення ( докладніше про розширення тут ) ви можете зберігати це легко "розділеним" на різні блоки в, config.yml
а потім вводити це як параметр, отриманий від контролера.
Всередині класу Extension всередині DependencyInjection
каталогу напишіть це:
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
}
Потім у своєму config.yml, config_dev.yml і ви можете встановити
my_nice_project:
contact_email: someone@example.com
Щоб мати можливість обробити це config.yml
всередині вашого, MyNiceBundleExtension
вам також знадобиться Configuration
клас у тому ж просторі імен:
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'my_nice_project' );
$rootNode->children()->scalarNode( 'contact_email' )->end();
return $treeBuilder;
}
}
Тоді ви можете отримати конфігурацію від свого контролера, як ви цього хотіли в своєму початковому запитанні, але зберігаючи parameters.yml
чистоту та встановивши її в config.yml
розділах:
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
ДРУГИЙ ПІДХІД: Відокремлений блок конфігурацій, введення конфігурації в сервіс
Для читачів, які шукають щось подібне, але для отримання конфігурації з сервісу, є навіть приємніший спосіб, який ніколи не захаращує спільний простір "параметри" і навіть не потребує container
передачі його в службу (передача всього контейнера - це практика уникати).
Цей фокус вище все ще "вводить" у простір параметрів вашого конфігурації.
Тим не менше, завантаживши своє визначення послуги, ви можете додати метод-виклик, наприклад, наприклад, setConfig()
який вводить цей блок тільки в службу.
Наприклад, у класі 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' ] ) );
}
}
Тоді services.yml
ви визначаєте свою послугу як звичайну, без абсолютних змін:
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
А потім у своєму SillyManager
класі просто додайте метод:
class SillyManager
{
private $contact_email;
public function setConfig( $newConfigContactEmail )
{
$this->contact_email = $newConfigContactEmail;
}
}
Зауважте, що це також працює для масивів замість скалярних значень! Уявіть, що ви налаштовуєте кролику із кроликами та потребуєте хоста, користувача та пароля:
my_nice_project:
amqp:
host: 192.168.33.55
user: guest
password: guest
Звичайно, вам потрібно змінити своє Дерево, але тоді ви можете зробити:
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );
а потім у службі робіть:
class SillyManager
{
private $host;
private $user;
private $password;
public function setConfig( $config )
{
$this->host = $config[ 'host' ];
$this->user = $config[ 'user' ];
$this->password = $config[ 'password' ];
}
}
Сподіваюся, це допомагає!