在CakePHP中保存指定ACL组名而不是组id的用户

  • 本文关键字:id 用户 保存 ACL CakePHP cakephp
  • 更新时间 :
  • 英文 :


我已经按照本教程设置了一个带有ACL的Cake 2.3.1应用程序,所以我有一个用户表和一个组表。

一切正常,但我有点困惑,我应该如何去保存新用户,因为我不希望用户能够选择自己的组。该组将根据用户在表单上输入的许多内容来选择,因此它将由控制器中的条件语句决定。

此刻我正在做这个:

$this->request->data['User']['group_id'] = '2';(或1,3或4,取决于控制器中的条件语句)。

然后,我在$this->data上做保存。这是有效的,但我希望能够指定组名称而不是硬编码id,以便当我们移动到生产并清除数据库时,如果组以不同的顺序添加则无关紧要。

我看到了两种方法。

第一个我没有尝试过,但它将把组表的主键更改为组的名称,并在group模型中设置primaryKey变量,并在所有其他模型中设置与此表的所有后续引用和关联。这可能会给您带来更多的头痛,我不建议这样做,因为您可能会以这样或那样的方式破坏ACL组件。

另一种方法是我要做的,它需要你做一点编程(我知道Cake没有一个简单的方法来做这个)。在User模型中,放置一个beforeSave,并在该函数中创建一个具有组名的虚拟变量,查找该名称并插入正确的id,然后删除该变量。

用户。ctp模型

public function beforeSave() {
    if (isset($this->data[$this->alias]['group_name'])) {
        //do the lookup with the group_name
        $group = $this->Group->find('first', array('conditions'=>array('name'=>$this->data[$this->alias]['group_name'])));
        if (count($group) <= 0)
           //... throw an Exception or handle any way you want this case
        $real_group_id = $group['Group']['id'];
        $this->data[$this->alias]['group_id'] = $real_group_id;
        unset($this->data[$this->alias]['group_name']);
    }
    return true; //remember this is important! otherwise the save will stop
}

当您想要更改用户组或添加另一个用户时,只需在控制器中执行此操作$data_to_save['User']['group_name'] = 'webuser';而beforeSave函数将负责其余部分。

我意识到你要求一个简单的方法来做到这一点,但我想没有(虽然不确定,随时纠正我),beforeave函数可以为你节省大量的控制器上的重复代码。在清除数据库或更改组id时,唯一需要注意的是将它们与数据库中已有的用户正确地重新关联,但由于是"转向生产"更改,因此预定义的用户应该很少或没有。