Хотя решение о перемещении 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
втот же самый намespace:
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
передавался сервису (избегать передачи всего контейнера).
Этот трюк выше ""вводит" в пространство параметров вашей конфигурации.
Тем не менее, после загрузки определения службы, вы можете добавить вызов метода, например, 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' ];
}
}
Надеюсь, это поможет!