我有一个带有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 以便我可以正确覆盖它?或者 到外部供应商包吗?
答案 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捆绑软件文档