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



我有一个带有微内核的应用程序,并希望使用带有自定义配置的Symfony的TreeBuilder,因为该应用程序将非常通用,我希望在外部配置尽可能多的内容。我的问题是,我无法为symfony注册我的自定义namespace

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 AppDependencyInjection;
use SymfonyComponentConfigDefinitionBuilderTreeBuilder;
use SymfonyComponentConfigDefinitionConfigurationInterface;
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 AppDependencyInjection;
use SymfonyComponentDependencyInjectionContainerBuilder;
use SymfonyComponentHttpKernelDependencyInjectionConfigurableExtension;
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类中,我像这样初始化扩展,因此我还从原始research.yml获得了AppExtensiondump($mergedConfig)调用的输出

<?php
namespace App;
use AppDependencyInjectionAppExtension;
use DoctrineCommonAnnotationsAnnotationRegistry;
use SymfonyBundleFrameworkBundleKernelMicroKernelTrait;
use SymfonyComponentConfigLoaderLoaderInterface;
use SymfonyComponentDependencyInjectionContainerBuilder;
use SymfonyComponentHttpKernelKernel;
use SymfonyComponentRoutingRouteCollectionBuilder;
use SymfonyComponentYamlExceptionParseException;
use SymfonyComponentYamlYaml;
$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

那么我需要做什么,才能实际注册我的命名空间研究,以便我可以正确覆盖它?还是必须与外部供应商捆绑包?

你得到这个错误是因为你没有注册一个包,所以symfony不知道包配置命名空间。

我不能说你如何用你的方法解决这个问题,但我建议制作一个 AppBundle 而不是应用程序,并在 public function registerBundles() 中注册 AppBundle。

在一些样板(如 https://github.com/ikoene/symfony-micro(中查看 f.E.

或者,你可以尝试使用新的symfony Flex来设置你的项目。
它已经使用了微内核,是无捆绑的,并且还支持最新的稳定symfony版本(sf3.3(。
https://symfony.com/doc/current/setup/flex.html#using-symfony-flex-in-new-applications

因此,无需自己在轨道上构建某些东西。

由于Symfony不再建议使用Bundles((,创建Bundle不是解决这个问题的方法。

@see [https://symfony.com/doc/current/bundles.html][1]

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

[1]: Symfony Bundle 文档

相关内容

  • 没有找到相关文章

最新更新