通过编译器传递覆盖扩展配置
Override extension configuration via compiler pass
希望你一切顺利,我正在尝试通过某种自定义 Compiler Pass
覆盖现有的 api 平台配置 api_platform.mapping.paths
目标是将我的新配置与现有配置合并
这是我想在我的容器最复杂的时候更新它的配置部分:
# api/config/packages/api_platform.yaml
api_platform:
mapping:
# The list of paths with files or directories where the bundle will look for additional resource files.
paths: []
这是我的自定义编译器传递:
/**
* Class MergeApiMappingPathsConfigurationPass.
*/
class MergeApiMappingPathsConfigurationPass implements CompilerPassInterface
{
/**
* {@inheritdoc}
*/
public function process(ContainerBuilder $container)
{
$configs = $container->getExtensionConfig('api_platform');
$configs[0]['mapping']['paths'] = array_merge($configs[0]['mapping']['paths'], [__DIR__.'/../../Resources/resources/']);
$container->prependExtensionConfig('api_platform', $configs[0]);
}
}
这是我注册新的自定义编译器的根包:
class DemoBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new MergeApiMappingPathsConfigurationPass());
}
}
我的新配置没有被考虑到并且不能正常工作的问题。
我认为您不想为此使用 CompilerPass。我认为您想使用 PrependExtensionInterface
和 prepend
方法。 (参见 https://symfony.com/doc/current/bundles/prepend_extension.html)
类似
class DemoBundleExtension extends Extension implements PrependExtensionInterface
{
public function prepend(ContainerBuilder $container)
{
if (!isset($container->getExtensions()['api_platform'])) {
return;
}
$configs = $container->getExtensionConfig('api_platform');
$configs[0]['mapping']['paths'] = array_merge($configs[0]['mapping']['paths'], [__DIR__.'/../../Resources/resources/']);
$container->prependExtensionConfig('api_platform', ['mapping' => $configs]);
}
public function build(ContainerBuilder $container)
{
parent::build($container);
}
}
我可能在某些细节上有误,但这可能会让您开始正确的方法。
希望你一切顺利,我正在尝试通过某种自定义 Compiler Pass
覆盖现有的 api 平台配置api_platform.mapping.paths
目标是将我的新配置与现有配置合并
这是我想在我的容器最复杂的时候更新它的配置部分:
# api/config/packages/api_platform.yaml
api_platform:
mapping:
# The list of paths with files or directories where the bundle will look for additional resource files.
paths: []
这是我的自定义编译器传递:
/**
* Class MergeApiMappingPathsConfigurationPass.
*/
class MergeApiMappingPathsConfigurationPass implements CompilerPassInterface
{
/**
* {@inheritdoc}
*/
public function process(ContainerBuilder $container)
{
$configs = $container->getExtensionConfig('api_platform');
$configs[0]['mapping']['paths'] = array_merge($configs[0]['mapping']['paths'], [__DIR__.'/../../Resources/resources/']);
$container->prependExtensionConfig('api_platform', $configs[0]);
}
}
这是我注册新的自定义编译器的根包:
class DemoBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new MergeApiMappingPathsConfigurationPass());
}
}
我的新配置没有被考虑到并且不能正常工作的问题。
我认为您不想为此使用 CompilerPass。我认为您想使用 PrependExtensionInterface
和 prepend
方法。 (参见 https://symfony.com/doc/current/bundles/prepend_extension.html)
类似
class DemoBundleExtension extends Extension implements PrependExtensionInterface
{
public function prepend(ContainerBuilder $container)
{
if (!isset($container->getExtensions()['api_platform'])) {
return;
}
$configs = $container->getExtensionConfig('api_platform');
$configs[0]['mapping']['paths'] = array_merge($configs[0]['mapping']['paths'], [__DIR__.'/../../Resources/resources/']);
$container->prependExtensionConfig('api_platform', ['mapping' => $configs]);
}
public function build(ContainerBuilder $container)
{
parent::build($container);
}
}
我可能在某些细节上有误,但这可能会让您开始正确的方法。