如何在symfony 2中获得控制器内实体的具体更新

时间:2015-08-07 22:51:07

标签: symfony symfony-forms

请我完全卡住,请帮助我。

我在两个实体之间有一个OneToMany关系;课程和集会。使用嵌入表格技术在同一页面中呈现课程的创建和版本形式及其相关的部分。 无论如何,我想要的是当webapp的管理员编辑一些课程细节(小时数,标题......)或相关的部分细节(日期或地点)时,我想通知订阅该课程的学生更新。我设法做到这一点,告诉用户:"课程......更新"。但我想要具体的更新,例如告诉用户:"管理员将下一个集会的日期改为../../...."。

我希望你理解我。我甚至无法想到在editAction中获得真正更新的方法。 任何帮助,将不胜感激。这是我的控制器的editAction:

    public function editAction($id, Request $request)
{   
    $em = $this->getDoctrine()->getManager();
    $course = $em->getRepository('OCUserBundle:Course')->find($id);
    $form = $this->createForm(new CourseType(), $course);
    if ($form->handleRequest($request)->isValid()) {
      $em->flush();

// this StudentCourse is the association entity between student and course which holds extra fields ( date registration , etc ..)

   $studentcourse = $em->getRepository('OCUserBundle:StudentCourse')->findBy(array('course' => $course));

// this is the service I created to notify a list of users 

   $notificateur=$this->get('Notificateur');
   $repository2=$this->getDoctrine()->getManager()->getRepository('OCUserBundle:Student');
      foreach ($studentcourse as $sc)
        { $user=$sc->getStudent()->getId();
        $student=$repository2->findBy(array('id' => $user));
        $notificateur->notifier('the course '.$course->getTitle().' is updated',$student);
        }

  return new Response('OK'); }

return $this->render('OCUserBundle:Course:course.html.twig', array(
  'form'   => $form->createView(),
  'course' => $course
));

1 个答案:

答案 0 :(得分:2)

创建一个学说监听器:

http://doctrine-orm.readthedocs.org/en/latest/reference/events.html

  • preUpdate
  • 中了解哪个Seance正在更新
  • postFlush
  • 中发送通知

代码看起来像(未经过测试):

class SceanceUpdateListener
{
    private $notifier;

    public function __construct(Your\Notifier\NotifierClass $notifier)
    {
        $this->notifier = $notifier;
        $this->updatedSceances = [];
    }

    public function preUpdate(PreUpdateEventArgs $args)
    {
        $entity = $args->getEntity();
        if ($entity instanceof Sceance) {
            $this->updatedSceances[] = $entity;
        }
    }

    public function postFlush(PostFlushEventArgs $args)
    {
        if (count($this->updatedSceances) === 0) {
            return;
        }
        $studentRepository = $args->getEntityManager()->getRepository('OCUserBundle:Student');
        foreach ($this->updatedSceances as $sceance) {
            $users = $studentRepository->getUsersForSceance($sceance);
            $this->notifier->doStuff($users, $sceance);
        }
    }
}

和监听器定义:

<service id="listener_name" class="Your\Listener\Class">
    <argument type="service" id="Notificateur" />
    <tag name="doctrine.event_listener" event="preUpdate" />
    <tag name="doctrine.event_listener" event="postFlush" />
</service>

更新

要了解实体中的更改内容,您可以使用getEntityChangeSet事件中收到的PreUpdateEventArgs preUpdate方法。

PreUpdateEventArgs::getEntityChangeSet将返回已更改的属性数组。对于每个属性,您将可以访问旧值和新值。

我认为这就是你要找的东西。

public function preUpdate(PreUpdateEventArgs $args)
{
    $entity = $args->getEntity();
    if ($entity instanceof Sceance) {
        $changeSet = $args->getEntityChangeSet();
        // do something with the changeSet
        $this->updatedSceances[] = $entity;
    }
}