我在this tutorial之后设置了一个带有ACL的Cake 2.3.1应用程序,所以我有一个用户表和一个组表。
一切正常,但我对如何保存新用户感到有些困惑,因为我不希望用户能够选择他们自己的组。该组将根据用户在表单上输入的一些内容进行选择,因此它将由控制器中的条件语句确定。
目前我正在这样做:
$this->request->data['User']['group_id'] = '2';
(或1,3或4,取决于控制器中的条件语句)。
然后,我正在对$this->data
进行保存。这有效,但我希望能够指定组名称而不是硬编码ID,这样当我们转移到生产并清除数据库时,如果添加组是无关紧要的不同的顺序。
答案 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时,唯一需要注意的是将它们与数据库中已有的用户正确地重新关联,但由于是“转向生产”更改,已经预定义的用户应该很少或者无。