为Symfony MicroKernel注册自定义配置命名空间

时间:2017-11-15 10:47:28

标签: php symfony dependency-injection configuration microkernel

我有一个带有MicroKernel的应用程序,并希望将Symfony的TreeBuilder与自定义配置一起使用,因为该应用程序非常通用,我希望尽可能多地在外部配置。我的问题是,我无法在symfony注册我的自定义There is no extension able to load the configuration for "research" (in /var/www/html/src/app/config/config.yml). Looked for namespace "research", found "framework", "twig", "sensio_framework_extra", "web_profiler"

Configuration

我有这个<?php namespace App\DependencyInjection; use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; class Configuration implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('research'); // @formatter:off $rootNode ->children() ->arrayNode('questions') ->children() ->integerNode('client_id')->end() ->scalarNode('client_secret')->end() ->end() ->end()// twitter ->end(); // @formatter:on return $treeBuilder; } } 课程:

AppExtension

和我的<?php namespace App\DependencyInjection; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\DependencyInjection\ConfigurableExtension; class AppExtension extends ConfigurableExtension { // note that this method is called loadInternal and not load protected function loadInternal(array $mergedConfig, ContainerBuilder $container) { dump($mergedConfig); } public function getAlias() { return 'research'; } }

AppKernel

在我的dump($mergedConfig)课程中,我正在初始化此类扩展程序,因此我也会从AppExtension <{1}}中获得research.yml次调用的输出/ strong>来自我的原始 <?php namespace App; use App\DependencyInjection\AppExtension; use Doctrine\Common\Annotations\AnnotationRegistry; use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\Routing\RouteCollectionBuilder; use Symfony\Component\Yaml\Exception\ParseException; use Symfony\Component\Yaml\Yaml; $loader = require __DIR__ . '/../vendor/autoload.php'; // auto-load annotations AnnotationRegistry::registerLoader(array($loader, 'loadClass')); /** * Class AppKernel */ class AppKernel extends Kernel { use MicroKernelTrait; ... protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader) { $researchConfig = Yaml::parse(file_get_contents(__DIR__ . '/config/research.yml')); $appExtension = new AppExtension(); $appExtension->load(researchConfig, $c); $loader->load(__DIR__ . '/config/config.yml'); } ... }

config.yml

然而,当我的framework: secret: S0ME_SUPER_SECRET profiler: { only_exceptions: false } research: questions: client_id: 2342323423 clent_secret: mysecret 看起来像这样时,我得到上面提到的错误:

id, insert_time, JSON-object

所以我需要做什么,实际注册我的命名空间 research 以便我可以正确覆盖它?或者 到外部供应商包吗?

2 个答案:

答案 0 :(得分:3)

你得到错误,因为你没有注册一个包,所以symfony不知道bundle config namespace。

我不知道你怎么能用你的方法解决这个问题,但我建议你做一个AppBundle而不是App,并在public function registerBundles()注册AppBundle。

见f.E.在某些样板材中,如https://github.com/ikoene/symfony-micro

另外,您可以尝试使用新的symfony Flex设置项目 这已经使用了MicroKernel,是无包装的,也支持最新的稳定symfony版本(sf3.3) https://symfony.com/doc/current/setup/flex.html#using-symfony-flex-in-new-applications

所以不需要自己在轨道上建造一些东西。

答案 1 :(得分:0)

由于Symfony不再建议使用捆绑软件(),因此创建捆绑软件不是解决问题的方法。

@请参见[https://symfony.com/doc/current/bundles.html][1]

在4.0之前的Symfony版本中,建议使用捆绑包组织自己的应用程序代码。不再建议这样做,捆绑软件仅应用于在多个应用程序之间共享代码和功能。

[1]:Symfony捆绑软件文档