如何在构造符号中使用循环和不同参数调用两个类



>我有一个循环来浏览 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;
    }

你对Symfony

的依赖注入有一个基本问题,我建议你逐步阅读有关服务容器的文档,它是Symfony(和其他框架(的核心功能,非常重要。

如果在之后将扩展定义为服务,则不需要调用构造函数。如果你想根据扩展的价值获得其中一个服务,我会创建另一个名为AnalyserExtensionFactory的服务,它看起来像这样:

<?php
declare(strict_types=1);

namespace AppAnalyserExtension;
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;
    }
}

并在您的run()功能中使用此工厂后。

类接口应该在你的 Class1 和 Class2 中实现(并具有方法 setAnalyseinputrun (

高级提示:使用服务标签可以使该工厂更清洁

最新更新