如何在构造symfony中调用带有循环和不同参数的两个类

时间:2019-06-18 10:40:43

标签: symfony4

我有一个循环来浏览2类,但问题是它没有相同的签名 一个接受构造函数2输入,另一个接受单个输入 我该如何纠正自己被迫循环的情况?

我真的找不到解决办法

这是我的功能,在其中放入

  */
    public function run()
    {
        if (is_null($this->input) || empty($this->input)) {
            throw new EmptyDataException("No data or empty data");
        }

        foreach ($this->extensions as $extension) {
            $extensionProcess = "App\\Analyser\\Extension\\" . $extension->getCategory() . "\\" . $extension->getName();
            $instance = new $extensionProcess($this->ruleManager, $this->analyseRuleManager);
            $instance->setAnalyse($this->analyse);
            $instance->input($this->input);
            $instance->run();
        }
    }

这是1类

/**
     * Constructor.
     *
     * @param RuleManager $ruleManager
     * @param AnalyseRuleManager $analyseRuleManager
     */
    public function __construct(RuleManager $ruleManager,
                                AnalyseRuleManager $analyseRuleManager)
    {
        $this->ruleManager = $ruleManager;
        $this->analyseRuleManager = $analyseRuleManager;
    }

这是构造2

/**
     * Constructor.
     *
     * @param AnalyseManager $analyseManager
     */
    public function __construct(AnalyseManager $analyseManager)
    {
        $this->analyseManager = $analyseManager;
    }

1 个答案:

答案 0 :(得分:0)

您对Symfony的依赖注入有一个基本问题,我建议您逐步阅读有关service container的文档,这是Symfony(和其他框架)的核心特征,并且非常重要。 / p>

如果在将扩展定义为服务之后,则无需调用构造函数。如果您想根据扩展的值获得其中一项服务,我将创建另一个名为AnalyserExtensionFactory的服务,该服务看起来与此类似:

OuterModel

然后在您的<?php declare(strict_types=1); namespace App\Analyser\Extension; class AnalyserExtensionFactory { public function __construct(Class1 $class1, Class2 $class2) { $this->class1 = $class1; $this->class2 = $class2; } public function getByExtension(Extension $extension) : ?ClassInterface { switch ($extension->getName()) { case 'class1': return $this->class1; case 'class2': return $this->class2; } return null; } } 函数中使用此工厂。

ClassInterface应该在您的Class1和Class2中实现(并具有方法run()setAnalyseinput

高级提示:使用service tagging

可以使工厂更清洁