Я искал ответ, но не нашел ничего полезного ..
Я спросил на symfony github, но мне сказали написать здесь .. https://github.com/symfony/symfony/issues/28650
Я пишу простой пакет Symfony, но у меня проблема с изменением конфигураций по умолчанию. Я имею в виду, что я хочу использовать переводы yaml (не xliff), сопоставления доктрины yaml (не аннотации), проверку yaml (не аннотации) и т. д. (Я знаю, что yaml в доктрине устарел)
Есть ли возможность изменить эту конфигурацию внутри бандла? Я хочу, чтобы мои пакеты были настроены самостоятельно, я не хочу настраивать доктрину, переводы и т. д. В моем основном приложении.
Спасибо за помощь






Вы можете определить конфигурацию по умолчанию в Symfony через Классы расширения, также посмотрите это руководство Конфигурация пакета Symfony, оно много объясняет о конфигурации пакета. Конфигурации по умолчанию могут быть для доктрины, переводов или всего, что вы можете настроить на уровне приложения. С помощью Подготовить расширение возможно даже изменение других конфигураций пакетов.
Компонент конфигурации отвечает за управление этими правилами конфигурации, вы можете узнать больше о страницах Компонент конфигурации и Определение и обработка значений конфигурации в документации.
FOSOAuthServerBundle - это пример конфигурации Doctrine по умолчанию. Они предпочитают XML, но это выбор формата, логика конфигурации одинакова для XML, YAML или PHP.
Конфигурация msgphp / пользовательский пакет - другой пример конфигурации через файлы PHP.
Давайте поговорим в коде, это пример конфигурации YAML с сущностью доктрины и простым массивом конфигурации. Во-первых, класс create Configuration предоставляет правила конфигурации по умолчанию для нашего пакета.
// src/Acme/HelloBundle/DependencyInjection/Configuration.php
namespace Acme\HelloBundle\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('acme_hello');
$rootNode
->children()
->arrayNode('simple_array')
->children()
->scalarNode('foo')->end()
->scalarNode('bar')->end()
->end()
->end()
->arrayNode('doctrine')
->children()
->arrayNode('entity')
->children()
->scalarNode('class')->isRequired()->cannotBeEmpty()->end()
->end()
->end()
->arrayNode('manager')
->children()
->scalarNode('class')->defaultValue('Acme\\HelloBundle\\Entity\\Manager\\EntryManager')->end()
->end()
->end()
->end()
->end()
->end()
;
return $treeBuilder;
}
}
Во-вторых, подготовьте класс расширения нашего пакета для загрузки этих конфигураций.
//src/Acme/HelloBundle/DependencyInjection/AcmeHelloExtension.php
namespace Acme\HelloBundle\DependencyInjection;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
class AcmeHelloExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$loader = new YamlFileLoader(
$container,
new FileLocator(__DIR__.'/../Resources/config')
);
$loader->load('acme_hello.yaml');
$loader->load('services.yaml');
// you now have these 2 config keys
// $config['simple_array'] and $config['doctrine']
// $container->getDefinition('acme_hello.simple_array.foo');
}
}
Наконец, создайте определения YAML по умолчанию и зарегистрируйте наш менеджер записей в контейнере.
//src/Acme/HelloBundle/Resources/config/acme_hello.yaml
acme_hello:
simple_array:
foo: 'hello'
bar: 'world'
doctrine:
entity:
class: 'Acme\HelloBundle\Entity\Entry'
manager:
class: 'Acme\HelloBundle\Entity\Manager\EntryManager'
//src/Acme/HelloBundle/Resources/config/services.yaml
services:
acme_hello.entry_manager:
class: '%acme_hello.doctrine.manager.class%'
arguments: [ '@doctrine.orm.entity_manager', '%acme_hello.doctrine.entity.class%' ]
Также мы можем переопределить конфигурацию по умолчанию на уровне приложения.
//config/packages/acme_hello.yaml
acme_hello:
simple_array:
foo: 'world'
bar: 'hello'
Спасибо @grim. С вашим сообщением я проверяю, что ответы все еще обновлены для текущей экосистемы Symfony, она в значительной степени актуальна. Благодаря блестящей системе документов Symfony.
Этот ответ заслуживает большего доверия. Спасибо. Повторим, PrependExtension кажется ответом на вопрос, а остальные детали точны.