Zend __construct致命错误

时间:2012-06-01 00:58:49

标签: php zend-framework

我正在尝试将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()的内容......

有什么想法吗?

4 个答案:

答案 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"

这只是一个(简单的)实现,有许多方法可以为这只猫提供皮肤。

希望这有帮助。