1

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.');
    }
}
4

2 に答える 2

0

私の問題は、services.yamlのサービスIDの代わりに、クラス名が正常に機能するクラスConverterPassにありました。

于 2019-04-02T09:31:25.350 に答える