symfony - 替换继承另一个服务的参数
问题描述
我试图用编译器传递覆盖服务列表上的参数。
这对我所有的服务都很好,除了一个。该服务使用服务继承:
pim_connector.array_converter.flat_to_standard.product.value_converter.abstract:
class: '%pim_connector.array_converter.flat_to_standard.product.value_converter.abstract.class%'
arguments:
- '@pim_connector.array_converter.flat_to_standard.product.field_splitter'
pim_connector.array_converter.flat_to_standard.product.value_converter.simpleselect:
class: '%pim_connector.array_converter.flat_to_standard.product.value_converter.simpleselect.class%'
parent: pim_connector.array_converter.flat_to_standard.product.value_converter.abstract
arguments:
- ['pim_catalog_simpleselect', 'pim_reference_data_simpleselect']
tags:
- { name: 'pim_connector.array_converter.flat_to_standard.product.value_converter' }
如果我像这样转储我的参数,在我的编译器通过:
class MyCompilerPass implements CompilerPassInterface
{
/**
* @param ContainerBuilder $container
*/
public function process(ContainerBuilder $container)
{
$service = $container->getDefinition('pim_connector.array_converter.flat_to_standard.product.value_converter.simpleselect');
var_dump($service->getArguments());exit;
}
}
我有这个 :
/srv/pim/src/MyNamespace/PimCatalogBundle/DependencyInjection/CompilerPass/MyCompilerPass.php:31:
array (size=1)
0 =>
array (size=2)
0 => string 'pim_catalog_simpleselect' (length=24)
1 => string 'pim_reference_data_simpleselect' (length=31)
所以我试图用索引 0 替换参数,但我有这个错误:
request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\FatalThrowableError: "Type error: Argument 1 passed to Pim\Component\Connector\ArrayConverter\FlatToStandard\Product\ValueConverter\SimpleSelectConverter::__construct() must be an instance of Pim\Component\Connector\ArrayConverter\FlatToStandard\Product\FieldSplitter, array given
如果我尝试使用索引 1,我有这个:
Uncaught Symfony\Component\DependencyInjection\Exception\OutOfBoundsException: The argument "1" doesn't exist.
你知道这个问题吗?
服务的类别pim_connector.array_converter.flat_to_standard.product.value_converter.simpleselect
是这样的:
namespace Pim\Component\Connector\ArrayConverter\FlatToStandard\Product\ValueConverter;
use Pim\Component\Connector\ArrayConverter\FlatToStandard\Product\FieldSplitter;
class SimpleSelectConverter extends AbstractValueConverter
{
/**
* @param FieldSplitter $fieldSplitter
* @param array $supportedFieldType
*/
public function __construct(FieldSplitter $fieldSplitter, array $supportedFieldType)
{
parent::__construct($fieldSplitter);
$this->supportedFieldType = $supportedFieldType;
}
/**
* {@inheritdoc}
*/
public function convert(array $attributeFieldInfo, $value)
{
if ('' === $value) {
$value = null;
}
return [$attributeFieldInfo['attribute']->getCode() => [[
'locale' => $attributeFieldInfo['locale_code'],
'scope' => $attributeFieldInfo['scope_code'],
'data' => $value,
]]];
}
}
我的编译器通行证在这里:
class MyCompilerPass implements CompilerPassInterface
{
private const SERVICES = [
'pim_catalog.validator.constraint.attribute_type_for_option' => 0,
'pim_catalog.comparator.attribute.option' => 0,
'pim_api.controller.attribute_option' => 12,
'pim_catalog.query.elasticsearch.filter.option' => 2,
'pim_catalog.query.elasticsearch.sorter.option' => 1,
'pim_connector.array_converter.flat_to_standard.product.value_converter.simpleselect' => 1,
'pim_connector.array_converter.standard_to_flat.product.value_converter.simpleselect' => 1
];
/**
* @param ContainerBuilder $container
*/
public function process(ContainerBuilder $container)
{
foreach (self::SERVICES as $id => $index) {
$service = $container->getDefinition($id);
$service->replaceArgument($index, array_merge(
$service->getArgument($index),
['my_new_type']
));
}
}
}
解决方案
试试这个
pim_connector.array_converter.flat_to_standard.product.value_converter.simpleselect:
class: '%pim_connector.array_converter.flat_to_standard.product.value_converter.simpleselect.class%'
parent: pim_connector.array_converter.flat_to_standard.product.value_converter.abstract
arguments:
- '@pim_connector.array_converter.flat_to_standard.product.field_splitter'
- ['pim_catalog_simpleselect', 'pim_reference_data_simpleselect']
tags:
- { name: 'pim_connector.array_converter.flat_to_standard.product.value_converter' }
由于您的类 SimpleSelectConverter 需要服务作为第一个参数,而数组作为第二个参数
推荐阅读
- java - 从 Java Hashmap 生成树结构
- r - 通过元素访问列表组件的名称
- nativescript - Nativescript 提示对话框选择所有文本
- angular - 保存数组内的对象键
- javascript - Javascript 事件被捕获,但回调函数未执行
- c++ - 使用 boost::asio 而不链接到 OpenSSL
- php - 如何正确检测 PHP 中的用户 IP 地址?
- redirect - 我的 sitecore 页面正在重定向到 404 页面,但它存在于预览版中,并且也被验证为已发布
- asp.net-core - 无法使 .NetCore cookie 过期
- c# - 如何将 httpRuntime executionTimeout 设置为毫秒?