Для тестов на основе динамических условий, которые вы описываете, вы можете использовать динамические утверждения в ваших Zend_Acl
правилах.
Например:
class My_Acl_IsProfileComplete implements Zend_Acl_Assert_Interface
{
protected $user;
public function __construct($user)
{
$this->user = $user;
}
public function assert(Zend_Acl $acl,
Zend_Acl_Role_Interface $role = null,
Zend_Acl_Resource_Interface $resource = null,
$privilege = null)
{
// check the user's profile
if (null === $this->user){
return false;
}
return $this->user->isProfileComplete(); // for example
}
}
Тогда при определении вашего объекта Acl:
$user = Zend_Auth::getInstance()->getIdentity();
$assertion = new My_Acl_Assertion_IsProfileComplete($user);
$acl->allow($role, $resource, $privilege, $assertion);
Конечно, некоторые детали зависят от того, что вам нужно проверить, и что вы можете использовать в своей зависимости от того, что вы храните в своем вызове Zend_Auth::setIdentity()
- только идентификатор пользователя, полный пользовательский объект и т. Д. А роли, ресурсы и привилегии полностью зависят от приложения. Но, надеюсь, это дает идею.
Кроме того, поскольку объект подтверждения требует пользовательский объект при создании экземпляра, это динамическое правило не может быть добавлено в Bootstrap. Но вы можете создать базовый экземпляр Acl со статическими правилами во время начальной загрузки, а затем зарегистрировать плагин фронт-контроллера (скажем, для запуска на preDispatch()
), который добавляет динамическое утверждение. Таким образом, Acl будет полностью заполнен к тому времени, когда вы доберетесь до своих контроллеров, где, вероятно, вы будете их проверять.
Просто мысли вслух.