2015-03-31 2 views
2

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

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

<?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 окр:

 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, используемый в учебнике, поэтому я не понимаю свою проблему, возможно, я забыл использовать?

Благодаря

EDIT Здесь ошибки журналы (спасибо Michael & Yann для помогли мне):

[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 [] [] 
+0

Белая страница означает ошибку для меня ... Можете ли вы предоставить любой журнал? –

+0

Я отредактировал мое сообщение, чтобы добавить ошибку. ошибка в DEV: Предупреждение: Отсутствует аргумент 1 для MonApp \ UserBundle \ Mailer \ Mailer :: __ construct(). – Remi

ответ

2

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

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

UPDATE

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

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; 
     } 
+0

Да, я забыл ввести аргументы, но как я могу узнать, какие аргументы мне нужно отправить? потому что в FOSUser первым аргументом является SwiftMailer. И я не буду использовать SwiftMailer. Спасибо – Remi

+0

Если вы не хотите, чтобы какие-либо аргументы просто опускали их из конструктора. –

+0

Мне нужно использовать $ router, $ templating и $ parameters для функции "sendConfirmationEmailMessage" и "sendResettingEmailMessage", но мне не нужно $ mailerMonApp. как я могу их найти? Я ищу, как они реализованы в FOSUser, но я не нахожу его. – Remi

0

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