2017-08-03 12 views
0

私はこのフォーラムをフォローして、プロフィールにfos user bundleを編集するメールを送ろうとします。 "AppBundle \のEventListener \ ChangeProfileListener" AutowiringFailedException がサービスをautowireすることはできません私はservice.ymlでSymfony 3 FOSUserBundleプロフィールのメールでの確認

parameters: 
    #parameter_name: value 
    oc_user.email_change.listener.class: AppBundle\EventListener\ChangeProfileListener 

services: 
    app.form.registration: 
     class: AppBundle\Form\RegistrationType 
     tags: 
      - { name: form.type, alias: app_user_registration } 
    app.form.profileedit: 
     class: AppBundle\Form\ProfileType 
     tags: 
      - { name: form.type, alias: app_profile_edit } 
... 

    oc_user.email_change.listener: 
     class: %oc_user.email_change.listener.class% 
     arguments: ['@fos_user.mailer', '@fos_user.util.token_generator', '@router', '@session', '@security.token_storage'] 
     tags: 
      - { name: kernel.event_subscriber } 

後のファイル

/src/AppBundle/EventListener.php 

namespace AppBundle\EventListener; 

use FOS\UserBundle\FOSUserEvents; 
use FOS\UserBundle\Event\GetResponseUserEvent; 
use FOS\UserBundle\Event\FormEvent; 
use FOS\UserBundle\Mailer\MailerInterface; 
use FOS\UserBundle\Util\TokenGeneratorInterface; 
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\HttpFoundation\Session\SessionInterface; 
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; 

class ChangeProfileListener implements EventSubscriberInterface 
{ 
    private $mailer; 
    private $tokenGenerator; 
    private $router; 
    private $session; 
    private $tokenStorage; 

    public function __construct(
     MailerInterface $mailer, 
     TokenGeneratorInterface $tokenGenerator, 
     UrlGeneratorInterface $router, 
     SessionInterface $session, TokenStorageInterface $tokenStorage 
    ) { 
     $this->mailer = $mailer; 
     $this->tokenGenerator = $tokenGenerator; 
     $this->router = $router; 
     $this->session = $session; 
     $this->tokenStorage = $tokenStorage; 
    } 

    public static function getSubscribedEvents() 
    { 
     return array(
      FOSUserEvents::PROFILE_EDIT_INITIALIZE => 'onProfileEditInitialize', 
      FOSUserEvents::PROFILE_EDIT_SUCCESS => 'onProfileEditSuccess', 
     ); 
    } 

    public function onProfileEditInitialize(GetResponseUserEvent $event) 
    { 
     // required, because when Success's event is called, session already contains new email 
     $this->email = $event->getUser()->getEmail(); 
    } 

    public function onProfileEditSuccess(FormEvent $event) 
    { 
     $user = $event->getForm()->getData(); 
     if ($user->getEmail() !== $this->email) 
     { 
      // disable user 
      $user->setEnabled(false); 

      // send confirmation token to new email 
      $user->setConfirmationToken($this->tokenGenerator->generateToken()); 
      $this->mailer->sendConfirmationEmailMessage($user); 

      // force user to log-out 
      $this->tokenStorage->setToken(); 

      // redirect user to check email page 
      $this->session->set('fos_user_send_confirmation_email/email', $user->getEmail()); 
      $url = $this->router->generate('fos_user_registration_check_email'); 
      $event->setResponse(new RedirectResponse($url)); 
     } 
    } 
} 

を作成するが、私はいつもこのエラー

(1/1)を持っています:メソッド "__construct()"の引数 "$ mailer"は "FOS \ UserBundle \ Mailer \ MailerInterface"インタフェースを参照していますが、そのようなサービスは存在しません。このインターフェースを「fos_user.mailer.default」、「fos_user.mailer.twig_swift」、「fos_user.mailer.noop」のいずれかの別名にする必要があります。

私は、フォームを無効にしているが、それは

が私を助けることができる仕事します?

私のconfigファイル

# app/config/config.yml 
fos_user: 
    db_driver: orm # other valid values are 'mongodb' and 'couchdb' 
    firewall_name: main 
    user_class: AppBundle\Entity\User 
    from_email: 
     address: "%mailer_user%" 
     sender_name: "%mailer_user%" 
    registration: 
     form: 

      type: AppBundle\Form\RegistrationType 
      # if you are using Symfony < 2.8 you should use the type name instead 
      # type: app_user_registration 
     confirmation: 
      enabled: true 
    profile: 
     form: 
      type: AppBundle\Form\ProfileType 
fos_user.mailer: 
    alias: 'fos_user.mailer.default' 

答えて

1

エラーメッセージlareadyはそれを言う:

あなたは多分、これらの既存のサービスの一つに、このインターフェイスエイリアスはず: "fos_user.mailer.default"、「fos_user .mailer.twig_swift "、" fos_user.mailer.noop "

oc_user.email_change.listener: 
    class: %oc_user.email_change.listener.class% 
    arguments: [--> '@fos_user.mailer', <-- '@fos_user.util.token_generator', '@router', '@session', '@security.token_storage'] 
    tags: 
     - { name: kernel.event_subscriber } 

おそらく、FOS UserBundleで通知機能を有効にする必要があります:

# app/config/config.yml 
fos_user: 
    # ... 
    registration: 
     confirmation: 
      enabled: true 

に記載されているように、エラーが(サービスが--> <--でマークされた)設定で発生し

docs:https://symfony.com/doc/current/bundles/FOSUserBundle/emails.html#registration-confirmation

これが役に立たない場合は、エラーメッセージ内の前述のサービスの1つを参照するか、その1つを指すエイリアスを作成します。 fos_user.mailer.default

fos_user.mailer: 
    alias: 'fos_user.mailer.default' 

続いているとして、あなたのサービスを維持することができますし、fos_user.mailを参照するたびに、それは、別名で参照サービスを使用します。

+0

ありがとうございましたが、わかりません。私はまだ登録を有効にしています。fos_user.mailer: 別名:設定ファイルに 'fos_user.mailer.default' ??? –

+0

以下の手順に従ってください:https://symfony.com/doc/current/bundles/FOSUserBundle/emails.html#registration-confirmation これで十分です。 – dbrumann

関連する問題