У меня есть множество пакетов, которые имеют похожие конфигурационные файлы, называемые rules.yml, хранящиеся в BundleName/Resources/config/rules.yml. Каждый файл конфигурации следует той же структуре:
bundle_name:
rules:
name:
items: []
requirements: []
У меня есть один пакет RulerBundle. Этот пакет должен автоматически загружать, проверять и комбинировать все rules.yml, найденные в других пакетах. Я бы хотел, чтобы RulerBundle создавал что-то вроде:
bundle_a:
rules:
name: Rule 1
items: ['First Item']
requirements: ['Second Item', 'Third Item']
bundle_b:
rules:
name: Rule 2
items: ['Second Item']
requirements: ['Third Item']
Это должно автоматически обновляться при добавлении нового пакета с помощью правила.yml
Вопросов
Должен ли я проверять и обрабатывать конфигурацию в каждом комплекте? Это приведет к дублированию кода, поскольку правила проверки будут такими же.
Как я могу найти и слить каждую из конфигураций связки с помощью RulerBundle
Таким образом, вы можете написать расширение DependencyInjection в своем пакете верхнего уровня, который будет выполнять всю проверку. Не уверен, что должно произойти, если что-то недействительно, но вы можете что-то вроде этого:
// src/BundleName/DependencyInjection/BundleExtension.php
namespace Acme\HelloBundle\DependencyInjection;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class BundleName extends Extension implements PrependExtensionInterface
{
public function prepend(ContainerBuilder $container)
{
$bundles = $container->getParameter('kernel.bundles');
foreach ($bundles as $name => $extension) {
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.$name.'/../../Resources/config'));
// load the configuration file, returned as an array
$config = $loader->loadFile('rules.yml');
// validate the contents of your file
$this->validateConfig($config);
// append the config with the specified bundle name "bundle_a", "bundle_a"
$container->prependExtensionConfig($name, $config);
}
}
}
не тестировали ни одно из них, но в целом это основная идея. Вам нужно будет реализовать свой метод проверки конфигурации.