如何在构造symfony中使用循环和不同参数调用两个class
How to Call two class with loop and with different parameters in contruct symfony
我有一个循环浏览 2 class 但问题是它没有相同的签名
一个接受构造函数 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();
}
}
这是 class 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 的依赖注入有一个基本问题,我建议你逐步阅读关于 service container 的文档,它是 Symfony(和其他框架)的核心功能并且非常重要.
如果您将扩展定义为服务,则无需调用构造函数。如果您想根据扩展的值获得其中一项服务,我会创建另一个名为 AnalyserExtensionFactory 的服务,它看起来与此类似:
<?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;
}
}
在你的 run()
函数中使用这个工厂之后。
ClassInterface 应在您的 Class1 和 Class2 中实现(并具有方法 setAnalyse
、input
和 run
)
高级提示:service tagging
可以让这个工厂变得更干净
我有一个循环浏览 2 class 但问题是它没有相同的签名 一个接受构造函数 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();
}
}
这是 class 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 的依赖注入有一个基本问题,我建议你逐步阅读关于 service container 的文档,它是 Symfony(和其他框架)的核心功能并且非常重要.
如果您将扩展定义为服务,则无需调用构造函数。如果您想根据扩展的值获得其中一项服务,我会创建另一个名为 AnalyserExtensionFactory 的服务,它看起来与此类似:
<?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;
}
}
在你的 run()
函数中使用这个工厂之后。
ClassInterface 应在您的 Class1 和 Class2 中实现(并具有方法 setAnalyse
、input
和 run
)
高级提示:service tagging
可以让这个工厂变得更干净