Как использовать renderView и шаблоны веток в сервисе Symfony 4 - PullRequest
0 голосов
/ 04 июня 2018

Я создаю Службу Emailer в моем новом приложении Symfony 4.

Я перепробовал миллион вещей, но безуспешно.На данный момент я смог найти только несколько ресурсов по этой теме для S4.Любая помощь приветствуется.

Это то, чего я пытаюсь достичь.Я понимаю, что должен использовать разные сервисы внутри своего сервиса Emailer, но не повезло.

<?php

namespace App\Mailer;

class Emailer
{

    public function sendWelcome($email): \Swift_Mailer
    {
        $message = (new \Swift_Message('P****** - Welcome In!'))
            ->setFrom('no-reply@p****n.com')
            ->setTo($email)
            ->setBody(
                $this->renderView(
                // templates/emails/registration.html.twig
                    'emails/registration.html.twig',
                    array('name' => $user->getUsername())
                ),
                'text/html'
            )
            ->setCharset('utf-8');

        $mailer->send($message);

        return true;
    }
}

Ответы [ 2 ]

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

@ миль-м * утверждение use не то же самое, что и инъекция.Оператор use просто делает класс доступным с именем класса в качестве псевдонима.Внедрение зависимостей - это шаблон, который отделяет ваши классы друг от друга, что облегчает тестирование и отладку (вы можете поменять введенные объекты на фиктивные и т. Д.).

Один из способов внедрения Swift_Mailer - использовать параметр конструктора, т. е.

class Emailer
{
    /** @var \Swift_Mailer $mailer */
    private $mailer;    

    public function __construct(
        EngineInterface $templating,
        \Swift_Mailer $mailer <== mailer will be injected here
    ) : \Swift_Mailer
    {
        //...
        $this->mailer->send($message);
    }
}

class CallingClass
{
    //...
    $emailer = new Emailer(
        //EngineInterface instance
        //\Swift_Mailer instance <== injecting 
    );
    $emailer->sendWelcome('email@example.com');
}

Другие вопросы

  1. $mailer->send($message)

    Где ваши $определен экземпляр почтовой программы?

  2. public function sendWelcome($email): \Swift_Mailer

    return true;

    Является ли true допустимым экземпляром Swift_Mailer?

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

Сначала вам нужно внедрить ваш шаблонный сервис в ваш класс (внедрение конструктора), а затем вы можете использовать его для визуализации шаблона.

В коде вы можете увидеть, что мы вводим подсказку в конструкторепоэтому инъекции Symfony Dependency знают, что нам нужно.Тогда мы просто используем это.То же самое будет с вашим $mailer обслуживанием.

<?php

namespace App\Mailer;

use Symfony\Component\Templating\EngineInterface;

class Emailer
{

    /**
     * @var EngineInterface
     */
    private $templating;

    /**
     * TestTwig constructor.
     */
    public function __construct(EngineInterface $templating)
    {
        $this->templating = $templating;
    }

    public function sendWelcome($email): \Swift_Mailer
    {
        $message = (new \Swift_Message('P****** - Welcome In!'))
            ->setFrom('no-reply@p****n.com')
            ->setTo($email)
            ->setBody(
                $this->templating->render(
                // templates/emails/registration.html.twig
                    'emails/registration.html.twig',
                    array('name' => $user->getUsername())
                ),
                'text/html'
            )
            ->setCharset('utf-8');

        $mailer->send($message);

        return true;
    }
}
...