我有一个带有微内核的应用程序,并希望使用带有自定义配置的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
中获得了AppExtension
中dump($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 文档