0

私は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

4 に答える 4

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"

これは1つの(単純な)実装であり、この猫の皮を剥ぐ方法はたくさんあります。

お役に立てれば。

于 2012-06-01T10:58:41.257 に答える
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 関数はコンストラクタとして機能します。

于 2012-06-01T07:10:25.027 に答える
0

Zend_Controller_Action_Interfaceコンストラクターは次のようになります。

public function __construct(Zend_Controller_Request_Abstract $request,
                            Zend_Controller_Response_Abstract $response,
                            array $invokeArgs = array());

これは、クラスがコンストラクターに対して同じ宣言を持っている必要があることを意味します

于 2012-06-01T01:04:38.550 に答える
0

コンストラクターは変更できないため、別の方法で ACL を渡す必要があります。Zend_Authまた、 を呼び出すことでいつでもアクセスできることに注意してくださいZend_Auth::getInstance()

ACL にアクセスするには、Zend_Registry. ブートストラップで ACL を定義している場合は、それをレジストリに配置します。その後、レジストリを介してアクセスできます。またはZend_Controller_Action、ACL を取得するメソッドを提供する を拡張する新しいクラスを作成することもできます。

于 2012-06-01T01:15:54.423 に答える