如何在 Symfony 4 中使用实例正确调用函数

How to properly call a function with instance in Symfony 4

我正在尝试在 Symfony 4 中使用 SMTP 发送电子邮件,并且根据 docs.

我具有以下功能
public function send_smtp(\Swift_Mailer $mailer)
{
    $message = (new \Swift_Message('Hello Email'))
        ->setFrom('send@example.com')
        ->setTo('MyEmail@gmail.com')
        ->setBody('test email content');
    $mailer->send($message);
}

但是,我想从另一个函数调用此函数,例如

$this->send_smtp();

但它抱怨 'No parameters are passed' 和

$this->send_smtp(\Swift_Mailer);

也给出错误信息

Undefined constant 'Swift_Mailer'

可能是什么问题,如何解决?

有几种可能的解决方案。您可以在您的操作中添加带有类型提示的参数,然后使用它来调用您的函数:

/**
 * @Route("/something")
 */
public function something(\Swift_Mailer $mailer)
{
    $this->send_smtp($mailer);
}

或者您可以在 send_smtp 函数中从容器中检索服务:

public function send_smtp()
{
    $mailer = $this->get('mailer');

    $message = (new \Swift_Message('Hello Email'))
        ->setFrom('send@example.com')
        ->setTo('MyEmail@gmail.com')
        ->setBody('test email content');

    $mailer->send($message);

}

创建服务,例如

namespace App\Service\Mailer;

class Mailer
{
    private $mailer;

    public function __construct(\Swift_Mailer $mailer)
    {
        $this->mailer = $mailer;
    }

    public function send_smtp()
    {
        $message = (new \Swift_Message('Hello Email'))
            ->setFrom('send@example.com')
            ->setTo('MyEmail@gmail.com')
            ->setBody('test email content');

        $this->mailer->send($message);
    }
}

现在你可以通过 __construct:

public function __construct(Mailer $mailer) 
{
    $this->mailer = $mailer;
}

public function someAction()
{
    $this->mailer->send_smtp()
}

或者您可以通过方法或 属性 注入它。您可以在此处阅读有关注入的更多信息:https://symfony.com/doc/current/components/dependency_injection.html

P.S。我不建议你使用容器的方法 get 因为这个方法只适用于 public 服务,但在 Symfony 4 中服务默认是私有的。