Symfony 4 Доступ к Swift_Mailer в Сервисе - PullRequest
0 голосов
/ 13 ноября 2018

Я просматривал документацию Symfony 4.1 по использованию Swift_mailer. Однако, похоже, что в документации предполагается, что она используется только в классах Controller. Я пытаюсь создать Службу с несколькими повторно используемыми функциями, которые отправляют электронную почту.

Я создал файл EmailService.php в моей служебной директории. При создании нового экземпляра этого сервиса он быстро выдает и выдает ошибку:

"Слишком мало аргументов для работы App \ Service \ EmailService :: __ construct (), 0 передано в * MyApp \ src \ Controller \ TestController.php в строке 33 и ровно 1 ожидаемый "

Я не уверен, как правильно передать \ Swift_Mailer $ mailer в __construct? У меня включена автоматическая проводка в services.yaml, поэтому я не уверен, что мне нужно сделать по-другому?

class EmailService
{
    private $from = 'support@******.com';
    private $mailer;

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

Как передать \ Swift_Mailer в эту конструкцию EmailService?

Я попытался добавить это в мой config \ services.yaml, но безуспешно:

App\Service\EmailService:
        arguments: ['@mailer']

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Попробуйте:

#config/services.yaml

    App\Service\EmailService
        arguments: ['@swiftmailer.mailer.default', '@twig']
        public: true

А в вашем контроллере:

public function userConfirmation(EmailService $emailService)
{    
     $sent = $emailService->userConfirmation('some@emailaddress.com', '2ndParam');
     return new Response('Success') //Or whatever you want to return
 }

Вы работаете с Symfony 4.1, поэтому вы больше не вызываете сервисный контейнер в контроллере ... https://symfony.com/doc/current/service_container/3.3-di-changes.html

Также вы можете использовать FQCN "App \ Service \ MyService" для объявления служб в services.yaml и надлежащего файла legacy_aliases.yaml для объявления устаревших псевдонимов, таких как "app.service.my.service", которые помогают сохранить ваши services.yaml чистым на мой взгляд ...

0 голосов
/ 14 ноября 2018

Как упомянул dbrumann в комментарии, мне нужно было следовать правильному способу введения услуг.

Сначала , мне нужно было добавить службы в config / services.yaml

#config/services.yaml
emailservice:
    class: App\Service\EmailService
    arguments: ['@swiftmailer.mailer.default', '@twig']
    public: true

Второй , мне нужно настроить службу для приема как почтовика, так и ветки для рендеринга шаблона.

#App/Service/EmailService.php
<?php
namespace App\Service;

class EmailService
{
    private $from = 'support@*****.com';
    private $mailer;
    private $templating;

    public function __construct(\Swift_Mailer $mailer, \Twig\Environment $templating)
    {
        $this->mailer       = $mailer;
        $this->templating   = $templating;
    }
   public function userConfirmation(string $recipient, string $confCode) : bool
   {

        $message = (new \Swift_Message())
        ->setSubject('Some sort of string')
        ->setFrom($this->from)
        ->setTo($recipient)
        ->setBody(
            $this->templating->render(
                'email/UserConfirmation.html.twig',
                array('confCode' => $confCode)
            ),
            'text/html'
        )
        /*
         * If you also want to include a plaintext version of the message
        ->addPart(
            $this->renderView(
                'emails/UserConfirmation.txt.twig',
                array('confCode' => $confCode)
            ),
            'text/plain'
        )
        */
    ;
    return $this->mailer->send($message);
  }
}

Третий , чтобы вызвать его из контроллера, убедитесь, что ваш контроллер расширяет Контроллер , а не AbstractController ! Решающий шаг !! Вот пример, основанный на параметрах, которые мне нужны в моем сервисе:

public function userConfirmation()
{
     $emailService   = $this->get('emailservice');
     $sent = $emailService->userConfirmation('some@emailaddress.com', '2ndParam');
     return new Response('Success') //Or whatever you want to return
 }

Надеюсь, это поможет людям. AbstractController не предоставляет вам надлежащий доступ к сервисным контейнерам.

...