Я прочитал Документацию Symfony по Entity Listeners и Doctrine Documentation on Entity Listeners в дополнение к этому ответу и эта запись в блоге Эрик Гелоен, но я не могу заставить своего слушателя делать то, что я хочу. В этом объекте у меня есть поле, называемое статусом, и когда это поле изменяется, будет отправлено электронное письмо, уведомляющее получателя об изменении.
Юридическое лицо
У меня есть объект shipmentLine
со следующими аннотациями:
<?php
namespace Acme\Bundle\ShipmentBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\ExclusionPolicy;
use JMS\Serializer\Annotation\Expose;
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
* @ORM\EntityListeners({"\Acme\Bundle\ShipmentBundle\Listener\ShipmentLineListener"})
* @ExclusionPolicy("all")
*/
class ShipmentLine
{
. . .
}
Слушатель
В ShipmentLineListener реализованы функции __construct
и prePersist
:
<?php
namespace Acme\Bundle\ShipmentBundle\Listener;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Acme\Bundle\ShipmentBundle\Entity\ShipmentLine;
class ShipmentLineListener
{
private $mailer;
private $twig;
public function __construct(\Swift_Mailer $mailer, \Twig_Environment $twig)
{
$this->mailer = $mailer;
$this->twig = $twig;
}
public function prePersist(ShipmentLine $shipmentLine, LifecycleEventArgs $event)
{
/** @var \Swift_Mime_Message $message */
$message = \Swift_Message::newInstance()
->setSubject('Entity Listener test')
->setFrom(array('[email protected]' => 'Acme'))
->setTo(array('[email protected]' => 'Tommy (Acme)'))
->setBody(json_encode($event), 'text/html');
$this->mailer->send($message);
}
}
services.yml
Наконец, я зарегистрировал своего слушателя в services.yml.
entity.entity_listener.shipmentline_update:
class: Acme\Bundle\ShipmentBundle\Listener\ShipmentLineListener
arguments: [ "@mailer", "@twig" ]
tags:
- { name: doctrine.orm.entity_listener, event: prePersist }
Слушатель срабатывает, и почта отправляется. Но оба аргумента $shipmentLine
и $event
пусты. Может ли кто-нибудь увидеть, если я делаю что-то не так? Мне трудно увидеть какие-либо ошибки из того, что я прочитал.
Спасибо за ваше время.