我正在尝试在我的Symfony2应用程序中实现一些基本的ACL,并确保用户只访问他们被允许访问的实体,我创建了一个接口(UserAware)和一个原则过滤器,将"entity_table.user_id=SESSION_USERID"子句附加到查询中。
这非常有效,但后来我意识到,如果我能够设置 UserAware 接口持久化的所有实体的用户对象,那么除了将接口添加到实体之外,我就不必担心自己添加用户对象。
是否可以像使用全局生命周期 onflush 事件之类的单个过滤器一样简单地执行此操作,或者我是否必须向所有实体添加生命周期事件?
是的,可以全局添加侦听器。
首先创建一个侦听器(此示例侦听 PreUpdate 事件):
use DoctrineCommonPersistenceEventLifecycleEventArgs;
class MyEventListener
{
public function preUpdate(LifecycleEventArgs $args)
{
$entity = $args->getObject();
$entityManager = $args->getObjectManager();
// do what you want to do...
}
}
然后注册您的侦听器。
您可以在创建实体管理器之前执行此操作:
$eventManager = new DoctrineCommonEventManager();
$eventManager->addEventListener(array(DoctrineORMEvents::preUpdate), new MyEventListener());
$entityManager = DoctrineORMEntityManager::create($dbOpts, $config, $eventManager);
或者在创建后:
$eventManager = $entityManager->getEventManager();
$eventManager->addEventListener(array(DoctrineORMEvents::preUpdate), new MyEventListener());
在文档中阅读有关生命周期事件的更多信息。