如何在多个控制器之间共享对象(例如Zend_Auth的实例)

时间:2014-08-07 04:59:46

标签: php zend-framework

我在Zend Framework 1中有我的应用程序。我使用Zend_Auth来管理会话。下面是我在IndexController类中检查身份验证的方法:

class IndexController extends Zend_Controller_Action
{

    public function init()
    {
      $auth = Zend_Auth::getInstance();

      if ($auth->hasIdentity()) {
        $this->view->user = $auth->getIdentity();
      }
    }

    public function indexAction()
    {

    }

}

基本上它只是将用户的视图变量设置为auth对象中的任何内容。在我的视图中,我可以检查用户变量是否已设置并正确操作(例如,显示"欢迎汤姆!"以及注销链接)

但是,此功能在我的其他控制器中尚不可用。而不是在每个init()方法中复制相同的代码,我该怎么做?我不太确定在哪里放置代码。

更新:

我尝试在bootstrap文件中执行类似的操作:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
  protected function _initView() {
    $auth = Zend_Auth::getInstance();

    if ($auth->hasIdentity()) {
      $this->view->user = $auth->getIdentity();
    }
  }
}

..但我收到以下错误:Notice: Indirect modification of overloaded property Bootstrap::$view has no effect in /var/www/budgetz/application/Bootstrap.php on line 9 Warning: Creating default object from empty value in /var/www/budgetz/application/Bootstrap.php on line 9

1 个答案:

答案 0 :(得分:1)

您可以使用继承自Zend_Controller_Action的抽象类,如下所示:

abstract Class Yourlibrary_Controller_ControllerAbstract extends Zend_Controller_Action
{

    public function preDispatch()
    {
        $auth = Zend_Auth::getInstance();

        if ($auth->hasIdentity()) {
            $this->view->user = $auth->getIdentity();
        }
    }
}

您的控制器继承Yourlibrary_Controller_ControllerAbstract而不是Zend_Controller_Action