Прослушиватель событий Symfony — заполнить сущность

Кто может привести пример?
У меня есть лица Project а также Event — Много событий в одном проекте, поэтому, когда статус проекта меняется на 'closed_by_client'Мне нужно создать событие для этого проекта.

В контроллере:

$project = $this
->getDoctrine()
->getManager()
->getRepository('ArtelProfileBundle:Project')
->find($id);

$project->setCurrentStatus('closed_by_client');
$manager->persist($project);
$manager->flush();

Объект проекта:

/**
* Project.
*
* @ORM\Table(name="project")
* @ORM\HasLifecycleCallbacks
* @Gedmo\SoftDeleteable(fieldName="deletedAt")
* @ORM\Entity(repositoryClass="Artel\ProfileBundle\Entity\Repository\ProjectRepository")
* @ExclusionPolicy("all")
*/
class Project
{
const STATE_TO_BE_INDEXED_IN_ELA_NOT_APPROVED = 'not_approved';
const STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT = 'closed_by_client';

use Timestampable;
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @Expose()
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORM\Column(name="current_status", type="string", length=100, nullable = true)
* @Expose()
* @Type("string")
*/
protected $currentStatus = 'not_approved';

/**
* @ORM\OneToMany(targetEntity="CodeEvents", mappedBy="project", cascade={"persist", "remove"})
*/
protected $events;

/**
* @ORM\PrePersist()
*/
public function PrePersist(){
if($this->getCurrentStatus() == self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT){
$event = new CodeEvents();
$event
->setProject($this)
->setEvent(self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT)
;
}
}

/**
* @ORM\PreFlush()
*/
public function PreFlush(){
if($this->getCurrentStatus() == self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT){
$event = new CodeEvents();
$event
->setProject($this)
->setEvent(self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT)
;
}
}

Я думаю, что я мог бы сделать что-то вроде этого, но сущность Event не флеш в БД:

/**
* @ORM\PrePersist()
*/
public function PrePersist(){
if($this->getCurrentStatus() == self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT){
$event = new CodeEvents();
$event
->setProject($this)
->setEvent(self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT)
;
}
}

/**
* @ORM\PreFlush()
*/
public function PreFlush(){
if($this->getCurrentStatus() == self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT){
$event = new CodeEvents();
$event
->setProject($this)
->setEvent(self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT)
;
}
}

я добавить

    /**
* @ORM\PreFlush()
*/
public function PreFlush(LifecycleEventArgs $event){
$entityManager = $event->getEntityManager();
if($this->getCurrentStatus() == self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT){
$event = new CodeEvents();
$event
->setProject($this)
->setEvent(self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT)
;
$entityManager->persist($event);
$entityManager->flush();
}
}

но при сбрасывании сущности есть ошибка

`Catchable Fatal Error: Argument 1 passed to Proxies\__CG__\Artel\ProfileBundle\Entity\Project::PreFlush() must be an instance of Doctrine\ORM\Event\LifecycleEventArgs, instance of Doctrine\ORM\Event\PreFlushEventArgs given, called in /home/ivan/host/aog-code/vendor/doctrine/orm/lib/Doctrine/ORM/Event/ListenersInvoker.php on line 102 and defined`

Как создать прослушиватель для события — объекта Статус изменения проекта для ‘closed_by_client’ — создать объект Event?

Я не создал раннее событие, как создать событие для этой бизнес-логики?

3

Решение

Учтите, что методы prePersist и preFlush находятся внутри самого класса Project. Чтобы добавить его к объекту вашего мероприятия, вам нужно всего лишь использовать $this:

public function PrePersist(){
if($this->getCurrentStatus() == self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT){
$event = new CodeEvents();
$event->setProject($this);
}
}
0

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

В заголовке вы спрашиваете о прослушивателях событий Symfony, но на самом деле вы используете прослушиватели событий Doctrine.

Мои заметки здесь:

1, вам нужно будет создать событие symfony2 и запустить его из событий вашей доктрины. Если вы хотите, чтобы события symfony2 немного усложняли ситуацию, так как вам потребуется доступ к диспетчеру событий каркаса, вам нужно внедрить его в ваш LifeCycleEventListener.
Так:

  • создайте свое собственное событие Symfony для этого изменения статуса
    http://symfony.com/doc/current/components/event_dispatcher/introduction.html#creating-and-dispatching-an-event
  • создайте отдельный прослушиватель событий сущности Doctrine для вашей сущности Project, куда вы добавляете диспетчер событий фреймворка sf
  • определить его в конфигурации sf2
    http://symfony.com/doc/current/bundles/DoctrineBundle/entity-listeners.html
  • использование диспетчера событий в вашем обработчике доктрины для отправки события изменения статуса
  • Создайте своего подписчика или слушателя событий в Symfony, который будет обрабатывать событие изменения статуса (та же ссылка, что и в первой точке).

2, я бы рассмотрел проверку того, изменилось ли вообще поле состояния, иначе вы создадите много экземпляров CodeEvent (), когда любые другие свойства изменяют сущность Project и статус уже «closed_by_client»
Посмотреть здесь:
http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-callbacks-event-argument

0

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