CakePHP希望访问ACL节点



我已经做了一个简单的"change_email"函数,它的视图和控制器中的所有东西。实际上,除了保存数据之外,一切都工作得很好。当我提交我的表单和我的模型实际上运行它的save()方法CakePHP抛出一个错误:

AclNode::node() -找不到由"Array() "标识的Aro节点[Aro0。model] => User [0.]Foreign_key] => 11"

当然他找不到节点,因为它还没有被创建(当用户注册他的帐户时,不会自动创建节点)。我很好奇为什么我的模型想要找到节点,因为它不需要实际操作。

public function change_email()
    {
        if ($this->request->is("put")) {
            if (!empty($this->request->data)) {
                $this->User->validator()
                    ->add('password', array(
                        'valid' => array(
                            'rule' => 'validatePassword'
                        )
                    ))
                    ->add('email_confirm', array(
                        'valid' => array(
                            'rule' => 'validateEmail'
                        )
                    ));
                if ($this->User->save($this->request->data)) {
                    $this->set("status", true);
                }
            }
        }
    }

这是我在控制器中的代码。该模型除了其beforeFilter()方法只对密码进行哈希运算外,没有任何实际作用。

有人有什么想法吗?

如果使用Acl,通常需要在用户和组模型中使用parnetNode()和bindNode()方法。

使用AclBehavior

大多数AclBehavior在你的模型上透明地工作afterSave()。然而,使用它需要您的模型具有定义的parentNode()方法。这由AclBehavior来使用确定父->子关系。模型的parentNode()方法必须返回null或返回父模型引用。

属于Group模型的User模型内

public function parentNode() {
    if (!$this->id && empty($this->data)) {
        return null;
    }
    $data = $this->data;
    if (empty($this->data)) {
        $data = $this->read();
    }
    if (!$data['User']['group_id']) {
        return null;
    } else {
        return array('Group' => array('id' => $data['User']['group_id']));
    }
}
public function bindNode($user) {
    return array('model' => 'Group', 'foreign_key' => $user['User']['group_id']);
}

Group模型中,或者如果User模型没有任何父关联,它应该返回null

public $actsAs = array('Acl' => array('type' => 'requester'));
public function parentNode() {
    return null;
}

你还需要确保你正在用新的方法和控制器更新你的acos表。AclExtras是一个很好的插件,可以为您自动执行此操作

最新更新