我正在尝试将Zend_Acl
整合到我的应用程序中:
class AuthController extends Zend_Controller_Action
{
public function __construct (Zend_Auth $auth, Zend_Acl $acl)
{
$this->_auth = $auth;
$this->_acl = $acl;
}
}
但是我收到了这个错误:
AuthController声明:: __ construct()必须兼容 Zend_Controller_Action_Interface :: __ construct()的内容......
有什么想法吗?
答案 0 :(得分:0)
Zend_Controller_Action_Interface
如下所示:
public function __construct(Zend_Controller_Request_Abstract $request,
Zend_Controller_Response_Abstract $response,
array $invokeArgs = array());
这意味着您的类必须具有相同的构造函数声明
答案 1 :(得分:0)
由于您无法更改构造函数,因此必须以不同的方式传递ACL。另请注意,您可以随时致电Zend_Auth
来访问Zend_Auth::getInstance()
。
要访问您的ACL,您可以使用Zend_Registry
。如果要在引导程序中定义ACL,请将其放在注册表中。然后,您可以通过注册表访问它,甚至可以编写一个扩展Zend_Controller_Action
的新类,它提供了一种检索ACL的方法。
答案 2 :(得分:0)
您永远不会启动控制器实例,因为它的作业Zend_Controller_Front为您执行此操作,因此您无法使用其构造函数。但你可以做的是改用Zend_Registry
在你的Bootstrap.php
中Zend_Registry::set('acl',$acl);
Zend_Registry::set('auth',$auth);
在您的控制器中
public function init()
{
$this->_acl = Zend_Registry::get('acl');
$this->_auth = Zend_Registry::get('auth');
}
此init函数充当构造函数。
答案 3 :(得分:0)
你可以使用插件:
//This class effectively extends Zend_Controller_Front
//This plugin will dispatch with every request and provide user access control
//based on credentials provided at login.
class MY_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request) {
parent::preDispatch($request);
//setup ACL
$acl = new Zend_Acl();
//add Roles
$acl->addRole('guest');
//add Resources
$acl->add(new Zend_Acl_Resource('default'));
//set up access rules, everyone has access to the index page and the error page.
$acl->allow(NULL, array('index', 'error'));
$acl->allow(NULL, array('index', 'index'));
//a guest can only read content and login
$acl->allow('guest', 'page', array('index'));
//more ...
//fetch current user, $auth is set in loginAction()
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
$identity = $auth->getIdentity();
$role = strtolower($identity->role);
} else {
$role = 'guest';
}
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
if (!$acl->isAllowed($role, $module, $controller, $action)) {
if ($role == 'guest') {
$request->setControllerName('user');
$request->setActionName('login');
} else {
$request->setControllerName('error');
$request->setActionName('noauth');
}
}
}
}
在application.ini中注册插件:
resources.frontController.plugins.acl = "My_Controller_Plugin_Acl"
这只是一个(简单的)实现,有许多方法可以为这只猫提供皮肤。
希望这有帮助。