Как правильно вызвать функцию с экземпляром в Symfony 4 - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь отправить электронное письмо с SMTP в Symfony 4 , и у меня есть следующая функция согласно документам .

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();

Но он жалуется на «Параметры не передаются» и

$this->send_smtp(\Swift_Mailer);

также выдает сообщение об ошибке

Неопределенная константа 'Swift_Mailer'

В чем может быть проблема и как ее можно решить?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Создать сервис, например

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, поскольку этот метод работает только для общедоступных служб, но в Symfony 4 службы по умолчанию являются частными.

0 голосов
/ 29 июня 2018

Есть несколько возможных решений. Вы можете добавить параметр с вводом текста в вашем действии, а затем использовать его для вызова вашей функции:

/**
 * @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);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...