gpt4 book ai didi

php - 交响乐 3 : How can I inject a service dynamically depending on some runtime variable

转载 作者:行者123 更新时间:2023-12-02 01:02:11 26 4
gpt4 key购买 nike

假设我有以下接口(interface)/具体类:

interface EmailFormatter

class CvEmailFormatter implements EmailFormatter
class RegistrationEmailFormatter implements EmailFormatter
class LostPasswordEmailFormatter implements EmailFormatter

然后我有一个自定义的“邮件程序”服务,该服务从我的 Controller 操作中调用以发送电子邮件。

根据发送的电子邮件类型,我有哪些选项可以将 EmailFormatter 的正确实现注入(inject)到我的邮件程序服务中?

最佳答案

我会创建一个服务,在运行时选择正确的格式化程序,要么是某种工厂,要么如果你的格式化程序有依赖关系,可能是一个服务,你从容器中注入(inject)格式化程序。像这样:

class MailController extends AbstractController
{
private $mailer;
private $mailFormatterSelector;

public function __construct(...) { ... }

public function someAction()
{
// Do stuff ...

if (...some condition) {
$formatter = $this->mailFormatterSelector->getRegisterMailFormatter();
} else {
$formatter = $this->mailFormatterSelector->getLostPasswordEmailFormatter();
}
$mailer->sendEmail($formatter);

// Do more stuff ...
}
}

class MailFormatterSelector()
{
private $registrationFormatter;

public function __construct(EmailFormatter $registrationFormatter, ...)
{
$this->registrationFormatter = $registrationFormatter;
...
}

public function getRegisterMailFormatter(): EmailFormatter
{
return $this->registrationFormatter;
}

// ...
}

或者,如果您必须在构造期间将格式化程序传递到您的邮件程序中,您还可以创建多个具有不同别名的不同设置实例,然后根据需要将它们注入(inject)到服务和 Controller 中,如下所示:

# config/services.yaml
mailer1:
class: MyMailler
arguments:
$formatter: '@formatter1'
mailer2:
class: MyMailler
arguments:
$formatter: '@formatter2'

MyMailController:
arguments:
$mailer: '@mailer2'

然后在您的 Controller 或操作中,您可以通过 mailer1、mailer2、...(可能使用更好的名称)传递。

关于php - 交响乐 3 : How can I inject a service dynamically depending on some runtime variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49802599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com