【发布时间】:2015-06-01 16:11:02
【问题描述】:
我是 Symfony 的新手,关注 the Jobeet tutorial。我有三个实体 - 工作、类别和用户。我有以下服务监听器。
src/Ibw/JobeetBundle/Resources/config/services.yml
services:
ibw.jobeet.entity.job.container_aware:
class: Ibw\JobeetBundle\Doctrine\Event\Listener\JobListener
calls:
- [setContainer, ["@service_container"]]
tags:
- { name: doctrine.event_listener, event: postLoad }
src/Ibw/JobeetBundle/Doctrine/Event/Listener/JobListener.php
<?php
namespace Ibw\JobeetBundle\Doctrine\Event\Listener;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\Event\LifecycleEventArgs;
class JobListener
{
/** @var ContainerInterface */
protected $container;
/**
* @param ContainerInterface @container
*/
public function setContainer(ContainerInterface $container)
{
$this->container = $container;
}
/**
* @ORM\PostLoad
*/
public function postLoad(LifecycleEventArgs $eventArgs)
{
$entity = $eventArgs->getEntity();
if (method_exists($entity, 'setContainer')) {
$entity->setContainer($this->container);
}
}
}
我预计 postLoad 只会为 Job 实体调用,但我发现它也为其他两个实体 Category 和 User 调用。我只在 Job 实体中定义setContainer。所以,我得到了其他实体的未定义方法。我的解决方法是与method_exists 联系。
有没有办法只在特定实体上运行postLoad?
【问题讨论】:
-
我更新了下面的答案。我一开始就误会了。这次应该是这样。我自己测试过。
标签: php symfony symfony-2.6