我使用 Symfony 4.2 实现了策略模式,问题是下面的 addMethodCall 没有执行。
class ConverterPass implements CompilerPassInterface
{
const CONVERSION_SERVICE_ID = 'crv.conversion';
const SERVICE_ID = 'crv.converter';
public function process(ContainerBuilder $container)
{
// check if the conversion service is even defined
// and if not, exit early
if ( ! $container->has(self::CONVERSION_SERVICE_ID)) {
return false;
}
$definition = $container->findDefinition(self::CONVERSION_SERVICE_ID);
// find all the services that are tagged as converters
$taggedServices = $container->findTaggedServiceIds(self::SERVICE_ID);
foreach ($taggedServices as $id => $tag) {
// add the service to the Service\Conversion::$converters array
$definition->addMethodCall(
'addConverter',
[
new Reference($id)
]
);
}
}
}
在 kernel.php 我得到了受保护的函数 build(ContainerBuilder $container) { $container->addCompilerPass( new ConverterPass() ); }
我的 ConverterInterface.php
namespace App\Converter;
interface ConverterInterface
{
public function convert(array $data);
public function supports(string $format);
}
然后是 ConvertToSela.php 和类似的另一个 Convert
namespace App\Converter;
class ConvertToSela implements ConverterInterface
{
public function supports(string $format)
{
return $format === 'sela';
}
public function convert(array $data)
{
return 'sela';
}
}
在我执行的 Conversion.php 中,我得到空数组,这意味着未调用 addConverter。
class Conversion
{
private $converters;
public function __construct()
{
$this->converters = [];
}
public function addConverter(ConverterInterface $converter)
{
dd($converter);
$this->converters[] = $converter;
return $this->converters;
}
public function convert(array $data, $format)
{
foreach ($this->converters as $converter) {
if ($converter->supports($format)) {
return $converter->convert($data);
}
}
throw new \RuntimeException('No supported Converters found in chain.');
}
}