Доктрина 2 Ограничение Ассоциаций Динамически - PullRequest
1 голос
/ 09 декабря 2011

Итак, у меня есть следующее.

/** @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.) ..... В поисках других идей

Я предполагаю, что этот пост сводится к тому, что мне нужно иметь возможность отображать одни и те же данные по-разному в разных контекстах.

Так что я просто ищу любой совет, который кто-нибудь может дать ... примеры, материалы для чтения, мысли .....

...