2014-02-18 3 views
1

Я пытаюсь реализовать некоторый базовый ACL в своем приложении Symfony2 и убедиться, что пользователи обращаются к объектам, которым им разрешен доступ. Я создал интерфейс (UserAware) и доктрину фильтр, который добавляет предложение «entity_table.user_id = SESSION_USERID» where в запрос.События глобального жизненного цикла Doctrine2 (простой ACL)

Это работает отлично, но потом я понял, что если бы я смог установить объект пользователя всех сущностей, которые сохраняются с интерфейсом UserAware, тогда мне не придется беспокоиться о добавлении объекта пользователя, кроме добавления интерфейса к сущности.

Можно ли сделать это так же просто, как единственный фильтр с чем-то вроде глобального события onflush на жизненном цикле, или мне нужно добавлять события жизненного цикла ко всем сущностям?

ответ

1

Да, можно добавить слушателей по всему миру.

Сначала создайте слушатель (этот пример прослушивает событие PreUpdate):

use Doctrine\Common\Persistence\Event\LifecycleEventArgs; 

class MyEventListener 
{ 
    public function preUpdate(LifecycleEventArgs $args) 
    { 
     $entity = $args->getObject(); 
     $entityManager = $args->getObjectManager(); 

     // do what you want to do... 
    } 
} 

Затем зарегистрировать слушатель.

Вы можете сделать это до EntityManager создана:

$eventManager = new \Doctrine\Common\EventManager(); 
$eventManager->addEventListener(array(\Doctrine\ORM\Events::preUpdate), new MyEventListener()); 

$entityManager = \Doctrine\ORM\EntityManager::create($dbOpts, $config, $eventManager); 

Или после того, как он будет создан:

$eventManager = $entityManager->getEventManager(); 
$eventManager->addEventListener(array(\Doctrine\ORM\Events::preUpdate), new MyEventListener()); 

Подробнее о событиях жизненного цикла в the docs.

Смежные вопросы