Php 使用条令适配器时,如何从Zend_Auth/Zend_ACL获取角色?齐心协力

Php 使用条令适配器时,如何从Zend_Auth/Zend_ACL获取角色?齐心协力,php,zend-framework,doctrine,zend-auth,zend-acl,Php,Zend Framework,Doctrine,Zend Auth,Zend Acl,我正在使用Zend_Auth和一个使用条令的项目。我相信每个引导都正确完成,我可以登录 我的适配器如下所示: class Abra_Auth_Adapter_Doctrine implements Zend_Auth_Adapter_Interface { protected $_resultArray; private $username; private $password; public function __construct($username, $password) {

我正在使用Zend_Auth和一个使用条令的项目。我相信每个引导都正确完成,我可以登录

我的适配器如下所示:

class Abra_Auth_Adapter_Doctrine implements Zend_Auth_Adapter_Interface {

protected $_resultArray;
private $username;
private $password;

public function  __construct($username, $password) {

    $this->username = $username;
    $this->password = $password;

}

//based on feedbacks as response authenticate has changed to this
public function  authenticate() {
    $q = Doctrine_Query::create()
    ->from("Abra_Model_User u")
    ->leftJoin("u.Role r")
    ->where("u.username=? AND u.password=?", array($this->username,$this->password));
    $result = $q->execute();
    if (count($result) == 1) {
        return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $result->get("Mylibrary_Model_User"), array());//autoloaderNamespaces[] = "Mylibrary_" in application.ini
    } else {
        return new Zend_Auth_Result(Zend_Auth_Result::FAILURE, null, array("Authentication Unsuccessful"));
    }
}
我的Abra_控制器_Pluging_Acl看起来像这样

class Abra_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract {

public function preDispatch(Zend_Controller_Request_Abstract $request) {
    parent::preDispatch($request);
    $controller = $request->getControllerName();
    $action = $request->getActionName();
    $module = $request->getModuleName();

    $auth = Zend_Auth::getInstance();
    if($auth->hasIdentity()){
        $identity = $auth->getIdentity();
        $roles = $identity["Role"];
        $role = $roles["name"];
        $role = (empty ($role) || is_null($role))? "regular" : $role ;
    } else {
        $role = "guest";
    }

 }

现在有条令\u事件致命错误:spl\u autoload()[function.spl autoload]:无法加载类条令\u事件。我已经看到了这一点,我想知道这会如何影响我对Zend_会话的使用,我在php中启用了apc.dll是真的。非常感谢阅读本文。如何获得角色:在适配器中,成功登录后,而不是只返回用户名字段,返回整个用户对象如何?然后,当您调用
Zend\u Auth::getIdentity()
时,整个过程都将可用

问题1:如果将控制器视为资源,并且每个模块的ACL规则不同,那么资源名称也应该反映模块。这将解决具有相同控制器名称的模块问题

问题2:我不确定我是否理解正确。Zend_Auth及其存储将负责将uer标识保存在其自己的会话名称空间中。然而,我遇到了当数据库中的用户记录发生变化时该怎么办的问题——比如说,用户在登录会话期间修改其个人资料中的全名——而您正在站点模板中显示该全名,该模板来自
Zend_Auth::getIdentity()
。作为一个用户,我希望更改会反映在可见界面中,但更改只发生在db中,而不是会话中

我过去所做的是创建一个额外的auth适配器,它获取新的用户记录并始终返回success。当用户更新其配置文件时,我使用这个简单的适配器调用
Zend\u Auth::authenticate()
。会话存储得到更新,一切正常


[这种方法几乎肯定是一种黑客行为,因此我想听听其他方法。我确信我可以直接在会话存储中设置一个值,但当我上次尝试时,我无法使它完全正常工作。因此,我求助于额外的适配器解决方法。]

谢谢你花时间写这篇文章。我已经编辑了我的帖子,让问题2更加清晰。您好,我已经用实现您的想法时发现的结果和问题更新了脚本。我希望其他人可以从现在开始参与并分享他们自己的经验。谢谢。不管怎样,角色是数组?用户模型是用hasMany(“角色”)定义的吗?另一方面,您为什么希望auth适配器将所有内容转换为数组。条令创建对象图;为什么不留着呢?你好,大卫。很抱歉回复太晚。我工作有点忙,我真的想在回复你之前尝试一下你的建议。再次感谢你的时间。我已经更新了帖子,通过实施你的建议来展示我所看到的。谢谢b@lack唤醒者:延迟没有汗水;我们都很忙,对吗?看起来您的问题现在是APC问题。我对APC没有任何经验,但在我看来,你的推荐信是非常相关的。我注意到你的插件有一点(与你的原则加载问题无关)。我看到了计算
$role
,但从未对它做过任何事情。我假设还有更多的处理要做。