Я использую измененную версию того, что находится в книге «Zend Framework in Action» от Manning Press (доступно для скачивания в формате PDF, если вам это нужно сейчас). Я думаю, что вы можете просто скачать сопроводительный код с сайта книги. Вы хотите взглянуть на код главы 7.
Обзор:
Контроллер - это ресурс, а действие - это привилегия.
Поместите ваши разрешения и запреты в метод init контроллера.
Я также использую настроенную версию их Controller_Action_Helper_Acl.
Каждый контроллер имеет открытый статический метод getAcls:
public static function getAcls($actionName)
{
$acls = array();
$acls['roles'] = array('guest');
$acls['privileges'] = array('index','list','view');
return $acls;
}
Это позволяет другим контроллерам запрашивать разрешения этого контроллера.
Каждый метод init контроллера вызывает $ this -> _ initAcls (), который определен в моем собственном базовом контроллере:
public function init()
{
parent::init(); // sets up ACLs
}
Родитель выглядит так:
public function init()
{
$this->_initAcls(); // init access control lists.
}
protected function _initAcls()
{
$to_call = array(get_class($this), 'getAcls');
$acls = call_user_func($to_call, $this->getRequest()->getActionName());
// i.e. PageController::getAcls($this->getRequest()->getActionName());
if(isset($acls['roles']) && is_array($acls['roles']))
{
if(count($acls['roles'])==0) { $acls['roles'] = null; }
if(count($acls['privileges'])==0){ $acls['privileges'] = null; }
$this->_helper->acl->allow($acls['roles'], $acls['privileges']);
}
}
Тогда у меня просто есть функция с именем:
aclink($link_text, $link_url, $module, $resource, $privilege);
Он вызывает {$ resource} Controller :: getAcls () и проверяет разрешения для них.
Если у них есть разрешение, он возвращает ссылку, в противном случае он возвращает ''.
function aclink($link_text, $link_url, $module, $resource, $privilege)
{
$auth = Zend_Auth::getInstance();
$acl = new Acl(); //wrapper for Zend_Acl
if(!$acl->has($resource))
{
$acl->add(new Zend_Acl_Resource($resource));
}
require_once ROOT.'/application/'.$module.'/controllers/'.ucwords($resource).'Controller.php';
$to_call = array(ucwords($resource).'Controller', 'getAcls');
$acls = call_user_func($to_call, $privilege);
if(isset($acls['roles']) && is_array($acls['roles']))
{
if(count($acls['roles'])==0) { $acls['roles'] = null; }
if(count($acls['privileges'])==0){ $acls['privileges'] = null; }
$acl->allow($acls['roles'], $resource, $acls['privileges']);
}
$result = $acl->isAllowed($auth, $resource, $privilege);
if($result)
{
return '<a href="'.$link_url.'" class="aclink">'.$link_text.'</a>';
}
else
{
return '';
}
}