Кто может привести пример?
У меня есть лица 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?
Я не создал раннее событие, как создать событие для этой бизнес-логики?
Учтите, что методы 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);
}
}
В заголовке вы спрашиваете о прослушивателях событий Symfony, но на самом деле вы используете прослушиватели событий Doctrine.
Мои заметки здесь:
1, вам нужно будет создать событие symfony2 и запустить его из событий вашей доктрины. Если вы хотите, чтобы события symfony2 немного усложняли ситуацию, так как вам потребуется доступ к диспетчеру событий каркаса, вам нужно внедрить его в ваш LifeCycleEventListener.
Так:
2, я бы рассмотрел проверку того, изменилось ли вообще поле состояния, иначе вы создадите много экземпляров CodeEvent (), когда любые другие свойства изменяют сущность Project и статус уже «closed_by_client»
Посмотреть здесь:
http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-callbacks-event-argument