Итак, у меня есть следующее.
/** @Entity */
class Job {
/** @OneToMany(targetEntity="Invoice" ...) */ INVERSE SIDE
protected $invoices;
public function getInvoices() {
return $this->invoices;
}
}
В идеале я хотел бы отфильтровать счета, возвращаемые по ACL.Так что это мои мысли на данный момент.
1.) Я мог бы написать методы репозитория и использовать перевод моей логики ACL в DQL.
// in some client code....
// $constraint would contain the DQL logic needed to restrict association returned
$constraint = new InvoiceAccessConstraintFactory($user);
$jobs = $jobRepository->findAllSatisfying(array('status' => 'SomeStatus'), $constraint);
Моя проблема с этим методом заключается в том, что я чувствую, что его было бы трудно поддерживать, но я думаю, я думаю, будет довольно хорошей производительностью.
2.) Используйте прослушиватель событий PostLoad для создания настраиваемого прокси-сервера для PersistedCollection, который содержит исходную коллекцию счетов PersistedCollection и настраиваемый итератор, расширяющий FilterIterator.
PostLoad Listener
public function applyACL($args){
$job = $args->getEntity();
$proxy = new InvoiceAccessProxy($job->getInvoices(), array('iteratorClass' => 'InvoiceAccessFilter', 'user' => $user));
$job->setInvoices($proxy);
}
... so that in client code
foreach($job->getInvoices() as $invoice) {
// filtered through accept method in InvoiceAccessFilter
}
Не уверен в этом, хотя из-за прокси-сервера для PersistedCollectionчто я не уверен, что это возможно.Но мне нравится идея доступа к $ job-> getInvoices () и заставить его возвращать другой набор результатов в зависимости от контекста.
3.) Я где-то читал в документации Doctrine2, что реализация пользовательских AST Walkers может быть использована для реализации контроля доступа, но я не смог найти пример.И я думаю, что это будет сложно.
4.) ..... В поисках других идей
Я предполагаю, что этот пост сводится к тому, что мне нужно иметь возможность отображать одни и те же данные по-разному в разных контекстах.
Так что я просто ищу любой совет, который кто-нибудь может дать ... примеры, материалы для чтения, мысли .....