зарегистрировать настраиваемое пространство имен конфигурации для Symfony MicroKernel

У меня есть приложение с MicroKernel, и я хотел бы использовать TreeBuilder от Symfony с пользовательской конфигурацией, потому что приложение будет довольно общим, и я хотел бы настроить как можно больше внешних. Моя проблема в том, что я не могу получить свой заказ namespace зарегистрирован для 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 от моего оригинал research.yml

<?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

так что мне нужно сделать, чтобы на самом деле зарегистрировать мое пространство имен исследование чтобы я мог правильно его перезаписать? Или делает это иметь в комплекте с внешним поставщиком?

2

Решение

Вы получаете ошибку, потому что вы не регистрируете пакет, и поэтому symfony не знает пространство имен конфигурации пакета.

Я не могу сказать, как вы могли бы исправить это с помощью вашего подхода, но я бы предложил создать AppBundle вместо приложения и зарегистрировать AppBundle в public function registerBundles(),

Смотри Ф.Е. в некоторых шаблонах, таких как 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

Так что нет необходимости строить что-то с трассы самостоятельно.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]