【发布时间】:2021-12-25 04:43:49
【问题描述】:
这可能是一个愚蠢的问题,但最好的方法是什么?
所以,我在 Emailservices 的构造中使用了两个参数,即实体管理器和电子邮件工厂。
问题是我想从另一个调用这个类的一个函数,而不添加这两个参数。在这种情况下无需添加这两个。
当我做 $emailService = new EmailService();我得到的错误是参数太少而无法运行,但是如果我将类 EmailService $emailService 作为参数传递给 SendPaymentEmail 那么它可以工作 - 你能解释一下为什么以及这里最好的方法是什么?
class EmailService
{
private EntityManagerInterface $entityManager;
private EmailFactory $emailFactory;
public function __construct(EntityManagerInterface $em, EmailFactory $emailFactory)
{
$this->entityManager = $em;
$this->emailFactory = $emailFactory;
}
class PaymentService
{
public function sendPaymentEmail(User $user)
{
$emailService = new EmailService();
$sender = $this->container->get('twig')->getGlobals()['email_no_reply'];
return $emailService->sendPaymentEmail($sender, $user, 'customer_home');
}
}
错误:函数 App\Service\EmailService::__construct() 的参数太少,在第 36 行的 /var/www/html2/app/src/Service/PaymentService.php 中传递了 0,而预期正好是 2
【问题讨论】:
-
注入 EmailService 时一切正常,因为 autowire 正在服务容器中创建服务定义。请求处理程序反过来使用容器来注入服务。您可以使用 __construct(EntityManagerInterface $em = null, EmailFactory $emailFactory = null) 摆脱错误消息,但不要这样做。没有理由不使用注射。虽然可能有点离题,但从 twig 全局变量中提取信息毫无意义。您可能应该为此定义一个服务容器参数。
-
请更新您的问题以包括您如何使用
PaymentService::sendPaymentEmail($user)。实际上,Symfony 服务旨在在整个应用程序中使用依赖注入 (DI)。因此,无论何时您调用new EmailService,您都是在手动创建服务,而不是从已经由编译器配置的容器中使用 Symfony DI。 Autowire 通过使您不必在配置中手动定义服务来简化 DI 的使用。