Symfony превращает слушателя с lifecycleevent в подписчика

Я пробую некоторые базовые вещи в Symfony 3.1.5 на своем собственном UserBundle.

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

Я заявляю об этом в service.yml:

 #listener user pass et role
user.listener.user:
class: Willuna\UserBundle\Listener\UserSigninListener
arguments: [ '@doctrine', '@security.password_encoder' ]
tags:
- { name: doctrine.orm.entity_listener }

И слушатель выглядит так:

<?php
namespace Willuna\UserBundle\Listener;

use Willuna\UserBundle\Entity\User;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use Doctrine\Bundle\DoctrineBundle\Registry;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoder;
/**
* Description of UserSigninListener
*
*/
class UserSigninListener {

private $doctrine;
private $password;

public function __construct(Registry $doctrine, UserPasswordEncoder $password) {
$this->doctrine = $doctrine;
$this->password = $password;
}

public function prePersist(User $user, LifecycleEventArgs $args) {
// I hash and do some stuff in user
$user->setPassword($this->password->encodePassword($user, $user->getPassword()));

}
}

Теперь я хочу отправить подтверждение по электронной почте после создания пользователя.
Я пытался сделать другого слушателя, но я не работал.

Поэтому я забыл своего слушателя и превратил его в подписчика. Это дает мне ошибки об аргументах и ​​наборе текста в моем методе.

Здесь мой пользовательский объект:

<?php
namespace Willuna\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="Willuna\UserBundle\Repository\UserRepository")
* @UniqueEntity(fields="email", message="Email already taken")
* @UniqueEntity(fields="username", message="Username already taken")
* @ORM\EntityListeners({"Willuna\UserBundle\Subscriber\SigninSubscriber"})
* @ORM\HasLifecycleCallbacks()
*/
class User implements UserInterface, \Serializable
{
...

мой Service.yml:

    user.subscriber.signin:
class: Willuna\UserBundle\Subscriber\SigninSubscriber
arguments: [ '@security.password_encoder' , '@doctrine' ]
tags:
- { name: doctrine.event_subscriber}

Прекрасный подписчик:

<?php
namespace Willuna\UserBundle\Subscriber;

use Willuna\UserBundle\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Registry;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoder;
use Doctrine\Common\EventSubscriber;
//use Symfony\Component\EventDispatcher\EventSubscriberInterface;

use Doctrine\ORM\Event\LifecycleEventArgs;
//use Doctrine\Common\Persistence\Event\LifecycleEventArgs;

/**
* class SigninSubscriber
*
*/
class SigninSubscriber implements EventSubscriber {
private $password;
private $doctrine;

public function __construct(UserPasswordEncoder $password, Registry $doctrine) {
$this->password = $password;
$this->doctrine= $doctrine;
}public function getSubscribedEvents()
{
return array(
'prePersist',
'postPersist'
);
}

public function prePersist(User $user, LifecycleEventArgs $args ){
//change password and change my user

}

public function postPersist(LifecycleEventArgs $args){
//then I want to send an email
}
}

Я изменил свой код, чтобы выглядеть документация подписчиков

Наконец, у меня все еще есть эта ошибка, когда я создаю своего нового пользователя:

Type error: Argument 1 passed to Willuna\UserBundle\Subscriber\SigninSubscriber::__construct()
must be an instance of Symfony\Component\Security\Core\Encoder\UserPasswordEncoder,
none given, called in /var/www/cours/SYMFONY/willuna-dolls/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/DefaultEntityListenerResolver.php on line 73

Если я изменю порядок аргументов, он скажет ту же ошибку о реестре.

Если я удалю все аргументы, в моем методе будет сказано то же самое об аргументах prePersist(LifecycleEventArgs $args),

Итак, вот вопросы:

Можно ли создать подписчика с событием жизненного цикла и @doctrine и @encoder в аргументах?

Я слепой?

Я что-то пропустил?

PS: Первый раз я прошу помощи на форуме \ o / …. за исключением моих проблем с геморроем. Шучу, XD.

Простите за длинный пост.
Вот картошка

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]