Я добавил параметр в свой файл config.yml как таковой:
app.config:
contact_email: somebody@gmail.com
...
Да хоть убей, я не могу понять, как прочитать это в переменной. Я пробовал что-то подобное в одном из своих контроллеров:
$recipient =
$this->container->getParameter('contact_email');
Но я получаю сообщение об ошибке:
Параметр contact_email должен быть определен.
Я очистил свой кеш, я также искал всю документацию по перезагруженному сайту Symfony2, но я не могу понять, как это сделать.
Наверное, слишком устал, чтобы понять это сейчас. Может кто-нибудь помочь с этим?
symfony
configuration
josef.van.niekerk
источник
источник
swiftmailer: delivery_address: dev@example.com
Вы можете найти больше информации в кулинарной книге Symfony2%parameter_name%
обозначение - (в YAML)В то время как раствор движется
contact_email
кparameters.yml
легко, как это предлагается в других ответов, которые могут легко загромождать ваш файл параметров , если вы имеете дело с большим количеством пучков , или если вы имеете дело с вложенными блоками конфигурации.ПЕРВЫЙ ПОДХОД: Отдельный блок конфигурации, получение его в качестве параметра
С расширением ( подробнее о расширениях здесь ) вы можете легко «разделить» его на разные блоки в,
config.yml
а затем ввести это как параметр, получаемый из контроллера.Внутри вашего класса расширения внутри
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 и вы можете установить
Чтобы иметь возможность обрабатывать это
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 ); // 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' ]; } }
Надеюсь это поможет!
источник
MyNiceProjectExtension->load()
методе с этой линией:$container->setParameter( 'my_nice_project.contact_email', $processedConfig[ 'contact_email' ]);
. Спасибо, Хави!Я должен добавить к ответу дугласа, вы можете получить доступ к глобальной конфигурации, но symfony переводит некоторые параметры, например:
# config.yml ... framework: session: domain: 'localhost' ...
находятся
$this->container->parameters['session.storage.options']['domain'];
Вы можете использовать var_dump для поиска указанного ключа или значения.
источник
Чтобы иметь возможность предоставлять некоторые параметры конфигурации для вашего пакета, вам следует обратиться к документации для этого. Сделать это довольно просто :)
Вот ссылка: Как предоставить семантическую конфигурацию для пакета
источник
Как было сказано ранее - вы можете получить доступ к любым параметрам, используя контейнер для инъекций, и использовать его свойство параметра.
"Symfony - Работа с определениями контейнерных сервисов" - хорошая статья об этом.
источник
Я узнал простой способ из примера кода http://tutorial.symblog.co.uk/
1) обратите внимание на ZendeskBlueFormBundle и расположение файла
# myproject/app/config/config.yml imports: - { resource: parameters.yml } - { resource: security.yml } - { resource: @ZendeskBlueFormBundle/Resources/config/config.yml } framework:
2) обратите внимание на Zendesk_BlueForm.emails.contact_email и расположение файла
# myproject/src/Zendesk/BlueFormBundle/Resources/config/config.yml parameters: # Zendesk contact email address Zendesk_BlueForm.emails.contact_email: dunnleaddress@gmail.com
3) обратите внимание, как я получаю его в $ client и расположение файла контроллера
# myproject/src/Zendesk/BlueFormBundle/Controller/PageController.php public function blueFormAction($name, $arg1, $arg2, $arg3, Request $request) { $client = new ZendeskAPI($this->container->getParameter("Zendesk_BlueForm.emails.contact_email")); ... }
источник