在CakePHP中保存用户,并指定ACL组名而不是组ID

时间:2013-04-01 07:58:24

标签: cakephp

我在this tutorial之后设置了一个带有ACL的Cake 2.3.1应用程序,所以我有一个用户表和一个组表。

一切正常,但我对如何保存新用户感到有些困惑,因为我不希望用户能够选择他们自己的组。该组将根据用户在表单上输入的一些内容进行选择,因此它将由控制器中的条件语句确定。

目前我正在这样做:

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

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

1 个答案:

答案 0 :(得分:0)

我看到两种方法。

第一个我没试过,但是将组表的主键更改为组的名称,并在Group模型中设置primaryKey变量,并在所有后续引用和与此表关联其他型号。这可能会给你带来更多的麻烦,我不推荐它,因为你可能会以这种或那种方式打破ACL组件。

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

在User.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函数将负责其余部分。

我意识到你要求一个Cake-easy方式来做这个,但我猜没有(不确定,随意纠正我),beforeSave函数可以在控制器上节省大量重复代码。清除数据库或更改组ID时,唯一需要注意的是将它们与数据库中已有的用户正确地重新关联,但由于是“转向生产”更改,已经预定义的用户应该很少或者无。