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 で protected function 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.');
}
}