В то время как раствор движется contact_email
к parameters.yml
легко, как это предлагается в других ответов, которые могут легко загромождать ваш файл параметров , если вы имеете дело с большим количеством пучков , или если вы имеете дело с вложенными блоками конфигурации.
- Сначала отвечу строго на вопрос.
- Позже я предложу способ получения этих конфигураций от служб без передачи через общее пространство в качестве параметров.
ПЕРВЫЙ ПОДХОД: Отдельный блок конфигурации, получение его в качестве параметра
С расширением ( подробнее о расширениях здесь ) вы можете легко «разделить» его на разные блоки в, config.yml
а затем ввести это как параметр, получаемый из контроллера.
Внутри вашего класса расширения внутри DependencyInjection
каталога напишите это:
class MyNiceProjectExtension extends Extension
{
public function load( array $configs, ContainerBuilder $container )
{
$configuration = new Configuration();
$processedConfig = $this->processConfiguration( $configuration, $configs );
$container->setParameter( 'my_nice_project.contact_email', $processedConfig[ 'contact_email' ] );
}
Затем в вашем 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' );
ВТОРОЙ ПОДХОД: отдельный блок конфигурации, внедрение конфигурации в службу
Для читателей, которые ищут что-то подобное, но для получения конфигурации из службы, есть еще более приятный способ, который никогда не загромождает общее пространство "paramaters" и даже не требует container
передачи в службу (передача всего контейнера - это практика для избегать).
Этот трюк выше по-прежнему "вводит" в пространство параметров вашего config.
Тем не менее, после загрузки определения службы вы можете добавить вызов метода, например, setConfig()
который вводит этот блок только в службу.
Например, в классе Extension:
class MyNiceProjectExtension extends Extension
{
public function load( array $configs, ContainerBuilder $container )
{
$configuration = new Configuration();
$processedConfig = $this->processConfiguration( $configuration, $configs );
$loader = new YamlFileLoader( $container, new FileLocator( __DIR__ . '/../Resources/config' ) );
$loader->load( 'services.yml' );
$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' ];
}
}
Надеюсь это поможет!