Symfony2 и FOSUserBundle: Переопределение почтовой программы


Я пришел сюда, потому что у меня проблема с OVH и моим приложением symfony2, я не могу отправлять почту с помощью SwiftMailer. Для FOSUserBundle довольно проблематично сбросить пароль или активировать мою учетную запись после регистрации. Поэтому я хочу использовать функцию MAIL, реализованную в PHP, я следовал документации здесь. Поэтому я создал свой класс MailerInterface.php и класс Mailer.php, потому что этот класс отправляет почту с функцией sendEmailMessage

Здесь вы можете увидеть, как я реализовал класс:

<?php
      namespace MonApp\UserBundle\Mailer;

      use FOS\UserBundle\Model\UserInterface;

      interface MailerInterface
      {
           function sendConfirmationEmailMessage(UserInterface $user);

           function sendResettingEmailMessage(UserInterface $user);
      }
?>

И Mailer.php :

<?php
      namespace MonApp\UserBundle\Mailer;

      use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
      use Symfony\Component\Routing\RouterInterface;
      use FOS\UserBundle\Model\UserInterface;
      use MonApp\UserBundle\Mailer\MailerInterface;

      class Mailer implements MailerInterface
      {
          protected $mailerMonApp;
          protected $router;
          protected $templating;
          protected $parameters;

          public function __construct($mailerMonApp, RouterInterface $router, EngineInterface $templating, array $parameters) {
               $this->mailerMonApp = $mailerMonApp;
               $this->router = $router;
               $this->templating = $templating;
               $this->parameters = $parameters;
          }

          public function sendConfirmationEmailMessage(UserInterface $user) {
               The function...
          }

          public function sendResettingEmailMessage(UserInterface $user) {
               The function...
          }

          protected function sendEmailMessage($renderedTemplate, $fromEmail, $toEmail) {
              $renderedLines = explode("\n", trim($renderedTemplate));
              $subject = $renderedLines[0];
              $body = implode("\n", array_slice($renderedLines, 1));

              mail($toEmail, $subject, $body, '[email protected]');
          }
     }

Я добавил свой класс в качестве службы:

services:
     monapp.mailer:
          class: MonApp\UserBundle\Mailer\Mailer

И изменил config.yml :

service:
    mailer: monapp.mailer

Здесь ERROR в Dev env:

     Warning: Missing argument 1 for MonApp\UserBundle\Mailer\Mailer::__construct(), called in /home/domaine/www/nomappli/app/cache/dev/appDevDebugProjectContainer.php on line 831 and defined in /home/domaine/www/nomappli/src/MonApp/UserBundle/Mailer/Mailer.php line 29

Моя проблема в том, что когда я захожу на страницу сброса пароля, я пишу свой псевдоним, и после проверки формы у меня появляется белая страница. Я думаю, что я называю class and use, используемый в учебнике, поэтому я не понимаю своей проблемы, возможно, я забыл использовать ?

Спасибо

РЕДАКТИРОВАТЬ Вот ошибки в журналах (спасибо Майклу и Янну за то, что помогли мне):

[2015-03-31 14:55:35] request.INFO: Matched route "fos_user_resetting_send_email" (parameters: "_controller": "FOS\UserBundle\Controller\ResettingController::sendEmailAction", "_route": "fos_user_resetting_send_email") [] []
[2015-03-31 14:55:35] security.INFO: Populated SecurityContext with an anonymous Token [] []
[2015-03-31 14:55:35] request.CRITICAL: Uncaught PHP Exception InvalidArgumentException: "Unable to find template ""." at /home/nomappli/www/monapp/vendor/symfony/symfony/src/Symfony/Bridge/Twig/TwigEngine.php line 128 {"exception":"[object] (InvalidArgumentException: Unable to find template \"\". at /home/nomappli/www/monapp/vendor/symfony/symfony/src/Symfony/Bridge/Twig/TwigEngine.php:128, Twig_Error_Loader: Unable to find template \"\". at /home/nomappli/www/monapp/vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle/Loader/FilesystemLoader.php:106, InvalidArgumentException: Template name \"\" is not valid (format is \"bundle:section:template.format.engine\"). at /home/nomappli/www/monapp/app/cache/prod/classes.php:742)"} []
[2015-03-31 14:55:35] security.DEBUG: Write SecurityContext in the session [] []
Author: Cracs, 2015-03-31

2 answers

Вам не нужно копировать и вставлять код интерфейса. Он должен быть на своем месте: в FOSUserBundle. Вам просто нужно реализовать этот интерфейс. Это означает, что вам нужно создать класс, в котором вы размещаете implements MailerInterface.

У вас уже есть этот класс. Просто замените use MonApp\UserBundle\Mailer\MailerInterface; на use FOS\UserBundle\Mailer\MailerInterface и удалите свою копию исходного интерфейса.

ОБНОВЛЕНИЕ

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

services:
     monapp.mailer:
          class: MonApp\UserBundle\Mailer\Mailer
          arguments:
              - @router
              - @templating
              - {from_email: {confirmation: %fos_user.registration.confirmation.from_email%, resetiing: %fos_user.resetting.email.from_email%}}

Также измените свой метод конструктора: удалите $mailerMonApp из аргументов:

      public function __construct(RouterInterface $router, EngineInterface $templating, array $parameters) {
           $this->router = $router;
           $this->templating = $templating;
           $this->parameters = $parameters;
      }
 2
Author: Michael Sivolobov, 2015-03-31 11:58:31

Действительно, проблема совершенно ясна, вам не хватает некоторых ссылок на ваши услуги. Ваш класс требует (в качестве аргументов конструктора) некоторых параметров для работы. Но ваше определение сервиса не содержит ничего из этого. Я думаю, что вам нужно прочитать немного документации об услугах в Symfony.

 0
Author: Yann Eugoné, 2015-03-31 10:24:09