Я использую Symfony 3.1. Я хочу создать систему уведомлений в моем приложении в Symfony. Я создал объект с именем уведомление сохранять уведомления. Поэтому, когда пользователь создает, редактирует или удаляет запись в базе данных, я хочу сохранить это действие в таблица уведомлений. Я использовал метод аннотации HasLifecycleCallbacks (), и он заставил меня создать объект контроллера в моей сущности, но ничего не помогло. Как мне это сделать? Есть ли другое решение?
/**
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="CM\UserBundle\Repository\UserRepository")
* @ORM\HasLifecycleCallbacks()
*/
class User extends BaseUser {
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="nom", type="string", unique=true, length=255, nullable=true)
* @Assert\NotBlank()
*/
protected $nom;
/**
* @var int
*
* @ORM\Column(name="numero", type="integer", unique=true, nullable=true)
* @Assert\NotBlank()
*/
protected $numero;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set nom
*
* @param string $nom
*
* @return User
*/
public function setNom($nom)
{
$this->nom = $nom;
return $this;
}
/**
* Get nom
*
* @return string
*/
public function getNom()
{
return $this->nom;
}
/**
* Set numero
*
* @param integer $numero
*
* @return User
*/
public function setNumero($numero)
{
$this->numero = $numero;
return $this;
}
/**
* Get numero
*
* @return int
*/
public function getNumero()
{
return $this->numero;
}
/**
* @ORM\PreRemove
*/
public function notify(){
$controlleur = new RemoveController();
$em = $controlleur->getDoctrine()->getManager();
$notif = new Notification();
$notif->setOperation('recording');
$notif->setUser('William');
$em->persist($notif);
$em->flush();
}
}
Я решил свою проблему. Я не очень хорошо прочитал документацию. А потом я сделал еще несколько исследований. Итак, вот решение, которое работает для меня в Symfony 3.1.
Я использовал внедрение зависимости. Я ввел ManagerRegistry, чтобы иметь службу диспетчера сущностей и TokenStorage для службы tokenStorage, чтобы знать, что текущий пользователь подключен.
Я создал имя папки NotificationDB. И тогда я также создал имя класса NotificationDB.php который здесь код. Для этого примера я предполагаю, что у меня есть форма для регистрации Foo юридическое лицо.
namespace CM\GestionBundle\NotificationBD;
use Doctrine\Common\Persistence\ManagerRegistry;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use \CM\GestionBundle\Entity\Notification;
class NotificationBD {
private $managerRegistry;
/**
* @var TokenStorage
*/
private $tokenStorage;
public function __construct(ManagerRegistry $managerRegistry, TokenStorage $tokenStorage)
{
$this->managerRegistry = $managerRegistry;
$this->tokenStorage = $tokenStorage;
}
public function notifyEvent(){
$entityManager = $this->managerRegistry->getManager();
$user = $this->tokenStorage->getToken()->getUser();
$notif = new Notification();
$notif->setDateNotif(new \Datetime());
$notif->setUser($user);
$notif->setActionNotif('recording');
$notif->setObjetNotif('foo');
$entityManager->persist($notifEdition);
$entityManager->flush();
}
}
В CM \ GestionBundle \ Resources \ config **, я настроил как службу в ** services.yml файл, который здесь является содержанием:
CM_gestion.notification:
class: CM\GestionBundle\NotificationBD\NotificationBD
arguments: ['@doctrine', '@security.token_storage']
И тогда я создал слушателя, для которого будет вызывать эту услугу. Для этого примера я создам слушатель сущности который будет прослушивать событие регистрации и использовать сервис для сохранения уведомление юридическое лицо. Вот мой слушатель.
namespace CM\GestionBundle\DoctrineListener;
use CM\GestionBundle\NotificationBD\NotificationBD;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use \CM\GestionBundle\Entity\Foo;
class FooListener {
/**
* @var NotificationBD
*/
private $notificationBD;
public function __construct(NotificationBD $notificationBD) {
$this->notificationBD = $notificationBD;
}
public function postPersist(LifecycleEventArgs $args) {
$entity = $args->getObject();
if (!$entity instanceof Foo) {
return;
}
$this->notificationBD->notifyEvent();
}
}
В CM \ GestionBundle \ Resources \ конфиг
Последнее, что нужно сделать, это добавить этого слушателя в services.yml файл. Вот содержание
CM_gestion.doctrine_listener.foo:
class: CM\GestionBundle\DoctrineListener\FooListener
arguments:
- "@CM_gestion.notification"tags:
- {name: doctrine.event_listener, event: postPersist}
Все это. это решение работает для меня в Symfony 3.1. Эта проблема может быть помечена как решенная. Поблагодарить
Других решений пока нет …