Я создаю расширение для загрузки файлов конфигурации из всех установленных пакетов.
мое расширение выглядит следующим образом:
namespace Acme\MenuBundle\DependencyInjection; // use ... use Acme\MenuBundle\DependencyInjection\Configuration; class AcmeMenuExtension extends Extension { public function load(array $configs, ContainerBuilder $container) { $configuration = new Configuration(); $config = $this->processConfiguration($configuration, $configs); $finder = new \Symfony\Component\Finder\Finder(); $finder ->directories() ->in($container->getParameter('kernel.root_dir') . '/../src/*/*Bundle/Resources') ->path('config'); $possibleLocations = array(); foreach ($finder as $c_dir) { $possibleLocations[] = $c_dir->getPathName(); } $loader = new Loader\YamlFileLoader($container, new FileLocator($possibleLocations)); $loader->load('menu.yml'); } }
И тогда есть мой (очень простой) класс конфигурации: в будущем я добавлю более сложное дерево, но сейчас я хочу, чтобы он работал с этим:
namespace Acme\MenuBundle\DependencyInjection; // use ... class Configuration implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('mw_menu'); $rootNode ->children() ->scalarNode('mw_menu')->defaultValue('')->end() ->end(); return $treeBuilder; } }
Для тестирования я только разместил файл «menu.yml» внутри текущего MenuBundle \ Resources \ config с этим контентом:
# file: src\Acme\MenuBundle\Resource\config\menu.yml mw_menu: "some teststring"
Для ручного тестирования я использую testAction в контроллере по умолчанию, который фактически ничего не делает, но создает пустой шаблон.
Во всяком случае, я получаю эту ошибку:
InvalidArgumentException: There is no extension able to load the configuration for "mw_menu" (in {path to symfony}/app/../src/Acme/MenuBundle/Resources\config\menu.yml). Looked for namespace "mw_menu", found none
Как я могу это исправить?
Из того, что я сейчас понимаю, Symfony замечает ключ «mw_menu» в файле конфигурации, но не может найти соответствующую конфигурацию.
Я работал над статьей поваренной книги: как выявить семантическую конфигурацию?
Обратите внимание: я знаю о наборе меню Knp и подобных пакетах, но я хочу реализовать меню самостоятельно.
Кроме того, я нашел это уведомление. Он прав?
Это потому, что ваш код:
$rootNode = $treeBuilder->root('mw_menu'); $rootNode ->children() ->scalarNode('mw_menu')->defaultValue('')->end() ->end();
означает, что файл конфигурации должен выглядеть следующим образом:
mw_menu: mw_menu: "some teststring"
Чтобы быть более конкретным, вам нужно адаптировать свой код к любому узлу, который вы хотите. В общем, люди используют общий корень, например mw_menu
, а затем вторичное значение, например database_driver
в следующем примере:
$rootNode = $treeBuilder->root('mw_menu'); $rootNode ->children() ->scalarNode('database_driver')->defaultValue('orm')->end() ->end();
Тогда это будет выглядеть в файле конфигурации:
mw_menu: database_driver: mongo_db