【问题标题】:Zend_Auth quick and everywhere access to UserIDZend_Auth 随时随地快速访问 UserID
【发布时间】:2012-05-04 23:59:06
【问题描述】:

我有一个带有用户身份验证的 Zend 应用程序。对于数据库查询,我几乎在每个操作中都需要 UserID。当然,我希望主要在控制器中以及在视图脚本中进行快速访问。

我到目前为止的方式:

Zend_Auth::getInstance()->getIdentity()->User_ID

如何编写插件或帮助程序以更简单的方式提供用户 ID?

例如像这样:

$this->User_ID

【问题讨论】:

  • 为什么不在 insert() 方法中将数据库细节存储在 Zend_Db_Table 对象中
  • 我想要一种访问用户 ID 的快捷方式。它已经存储在 Auth 对象中。如果我理解你的想法真的很复杂。
  • 不是真的,如果你需要访问用户ID的唯一地方,你可以把它放在所有需要它的表类中,让他们处理,这样你就不必重复了它在每个控制器中。如果您真的想让它变得非常短,请创建一个像 My_User 这样的静态类来访问 Zend_Auth 对象,并为您需要的每个属性提供一个方法。然后你可以像My_User::id 这样调用它,调用时会运行完整的Zend_Auth::getInstance()->getIdentity()->User_ID;
  • 静态类会很棒!你能给我第一步吗?

标签: php zend-framework zend-auth


【解决方案1】:

您可以在控制器中创建可以在控制器构造函数中设置的属性:

$this->_User_ID = Zend_Auth::getInstance()->getIdentity()->User_ID;

或从Zend_Registry那里建立和使用时将其丢弃。

【讨论】:

  • 这将是重复的代码,因为我需要每个控制器中的 UserID 我应该如何将 UserID 保存在注册表中?在我的引导程序中? Zend_Registry::get('User_ID') 也很长。
  • 好的,我认为这是最好的方法。 Action Helpers 和 Plugins 还有其他缺点。
【解决方案2】:

这是一个插件,它将用户 id 注入到视图中,如果用户没有身份,则将其设置为 null。

<?php

class Application_Plugin_Identity extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $front     = Zend_Controller_Front::getInstance();
        $bootstrap = $front->getParam('bootstrap');

        $bootstrap->bootstrap('view');
        $view = $bootstrap->getResource('view');

        if (Zend_Auth::getInstance()->hasIdentity()) {
            $view->User_ID = Zend_Auth::getInstance()->getIdentity()->User_ID;
        } else {
            $view->User_ID = null;
        }
    }
}

要启用它,您可以像这样在引导方法中注册它:

Zend_Controller_Front::getInstance()
->registerPlugin(new Application_Plugin_Identity());

现在从您的任何视图脚本中,您可以引用$this-&gt;User_ID,如果未登录,它将包含用户的 id 或 null。

更新:

如果您最想从控制器访问动作助手,它会很好地工作。

在您的控制器中,调用 $userId = $this-&gt;_helper-&gt;Identity(); 以获取用户 ID。作为奖励,我也将用户 ID 分配给视图,因此您可以从视图中调用 $this-&gt;User_ID

<?php

class My_Helper_Identity extends Zend_Controller_Action_Helper_Abstract
{
    protected static $_userId = null;

    public function direct()
    {
        if ($this->_userId == null) {
            $request  = $this->getRequest();
            $view     = $this->getActionController()->view;

            if (Zend_Auth::getInstance()->hasIdentity()) {
                $user_id = Zend_Auth::getInstance()->getIdentity()->User_ID;
            } else {
                $user_id = null;
            }

            $view->User_ID = $user_id;
            $this->_userId = $user_id;
            $this->getActionController()->_userId = $user_id;
        }

        return $this->_userId;
    }
}

【讨论】:

  • 谢谢,如何从控制器调用它?
  • 您不需要从控制器调用它,插件将在 preDispatch() 处运行,这发生在执行控制器操作之前。因此,您的视图将自动具有该变量。如果您在控制器中,则可以引用 $this-&gt;view-&gt;User_ID 来获取控制器中的用户 ID(如果您是这个意思)。
  • 这就是我的意思。但它似乎并不那么优雅,因为我几乎从不需要它在视图中而是在我的控制器中。而$this-&gt;view-&gt;User_ID 太长了。 ;-) 应该是$this-&gt;User_ID
  • 谢谢,非常努力 :-) 不幸的是,我必须为每个控制器调用一次帮助程序才能访问 $this-&gt;_userId; 对吗?
  • 如果您需要访问它,您可以/必须调用它。该插件的优点是它会随着每个请求自动执行。动作助手的优点是它们只有在你调用它们时才会被包含并运行。但是是的,要使其可用,您仍然需要为每个控制器/动作调用一次。您唯一的其他选择是从 Zend_Controller_Action 扩展一个基本控制器类,它为您执行此操作并让您的所有控制器都从该类扩展。我认为插件和操作助手更标准。
猜你喜欢
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
相关资源
最近更新 更多