Система уведомлений в symfony 3.1

Я использую симфони 3.1. Я хочу создать систему уведомлений в своем приложении в symfony. Я создал объект с именем notification для сохранения уведомлений. Поэтому, когда пользователь создает, редактирует или удаляет запись в базе данных, я хочу сохранить это действие в таблице уведомлений. Я использовал метод аннотации 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();   
}
}

person William Bridge    schedule 28.07.2016    source источник


Ответы (1)


Я решил свою проблему. Я не очень хорошо читал документацию. А потом я провел еще несколько исследований. Итак, вот решение, которое работает для меня в 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']

И затем я создал слушателя, для которого будет вызываться этот сервис. В этом примере я создам прослушиватель объекта foo, который будет прослушивать событие регистрации и использовать службу для сохранения объекта notification. Вот мой foo listener.

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\config Последнее, что нужно сделать, это добавить этот прослушиватель в файл 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. Эту проблему можно отметить как решенную. Благодарить

person William Bridge    schedule 03.08.2016