Я попытался переопределить аргумент в списке служб с помощью прохода компилятора.
Это работает нормально для всех моих служб, за исключением одного.Эта служба использует наследование службы:
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']
));
}
}
}