Сначала я объясню, почему я реализовал свое решение, чтобы вы решили, подходит ли вам этот случай.
Мне нужен был способ легко загружать пользовательские файлы .yml в мойbundle (для большого количества пакетов), поэтому добавление отдельной строки в app / config.yml для каждого файла выглядело как большая проблема для каждой настройки.
Кроме того, я хотел, чтобы большинство конфигураций уже загружались по умолчанию, чтобы конечному пользователю даже не приходилось беспокоиться о настройке большую часть времени, особенно не проверяя, правильно ли настроен каждый файл конфигурации.
Если для вас это похоже на аналогичный случай, читайте дальше.Если нет, просто используйте решение Kris, это тоже хорошо!
Когда я столкнулся с необходимостью использования этой функции, Symfony2 не предоставил простой способ добиться этого, поэтому вот как я решилit:
Сначала я создал локальный класс YamlFileLoader, который был в основном тупым Symfony2:
<?php
namespace Acme\DemoBundle\Loader;
use Symfony\Component\Yaml\Yaml;
use Symfony\Component\Config\Loader\FileLoader;
/**
* YamlFileLoader loads Yaml routing files.
*/
class YamlFileLoader extends FileLoader
{
/**
* Loads a Yaml file.
*
* @param string $file A Yaml file path
*
* @return array
*
* @throws \InvalidArgumentException When config can't be parsed
*/
public function load($file, $type = null)
{
$path = $this->locator->locate($file);
$config = Yaml::parse($path);
// empty file
if (null === $config) {
$config = array();
}
// not an array
if (!is_array($config)) {
throw new \InvalidArgumentException(sprintf('The file "%s" must contain a YAML array.', $file));
}
return $config;
}
/**
* Returns true if this class supports the given resource.
*
* @param mixed $resource A resource
* @param string $type The resource type
*
* @return Boolean True if this class supports the given resource, false otherwise
*
* @api
*/
public function supports($resource, $type = null)
{
return is_string($resource) && 'yml' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'yaml' === $type);
}
}
Затем я обновил расширение DIC для своего пакета (обычно оно генерируется автоматически, если вы разрешаете Symfony2создать полную архитектуру пакета, если не просто создать файл DependencyInjection/<Vendor&BundleName>Extension.php
в каталоге пакета со следующим содержимым:
<?php
namespace Acme\DemoBundle\DependencyInjection;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;
use Acme\DemoBundle\Loader\YamlFileLoader;
/**
* This is the class that loads and manages your bundle configuration
*
* To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
*/
class AcmeDemoExtension extends Extension
{
/**
* {@inheritDoc}
*/
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.xml');
// until here everything is default config (for your DIC services)
$ymlLoader = new YamlFileLoader(new FileLocator(__DIR__.'/../Resources/config'));
$container->setParameter('param_name', $ymlLoader->load('yaml_file_name'))); // load yml file contents as an array
}
}
И теперь вы можете получить доступ / передать конфигурацию yaml в качестве простого параметра службы (т. е. %param_name%
)для services.yml)