【问题标题】:New class without passing constructor variables没有传递构造函数变量的新类
【发布时间】: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 的使用。

标签: php symfony oop


【解决方案1】:

我不明白你的问题有点不清楚,但是如果你想从另一个类或函数等调用某个类的方法(不创建实例),你必须使方法静态例如:

public static function sendPaymentEmail(User $user){...};

这样称呼:

EmailService::sendPaymentEmail($user);

【讨论】:

  • sendPaymentEmail 不是EmailService 类的一部分,它是PaymentService 类的一部分。 OP 错误地格式化了代码,这使它看起来很混乱。
猜你喜欢
  • 2015-10-04
  • 2016-05-23
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2022-01-12
  • 2021-02-05
  • 2020-03-18
  • 2012-02-17
相关资源
最近更新 更多