我目前正在构建一个Web应用程序,它有两个模型,分别是Donor和Donation Models。它有多个用户角色。当员工用户首次注册捐赠者时,我希望他被重定向到另一种形式,这样他就可以填写捐赠详细信息(捐赠者在第一次捐赠成功后就会注册)。
首先,我应该创建一个捐赠控制器,我将使用以下方式重定向用户:
return $this->redirect(array('controller'=>'donations','action'=>'add'));
为了使上述工作,它需要我在这样的会话中保存新注册的捐赠者的身份:
$this->Session->write('id', $this->Donor->id);
因此用户被重定向到网址中的'捐赠/添加',这很好..但我认为这有一些缺陷。我是否应该在Donor控制器中创建另一个名为“add_donation”的动作,它将具有各自的“视图”。我的想法是能够形成一个类型的网址:'donor / add_donation / 4'(4是donor_id!) 此URL遵循以下结构:'controller / action / id'
如果有人能够对最佳做法有所了解,或者向我的解决方案(前者,使用会话等)描述任何警告,请帮助兄弟!我要深深感激你!提前谢谢!
答案 0 :(得分:2)
保存数据后,您可以在DonorsController中执行此操作:
$this->redirect(array(
'controller' => 'donations',
'action' => 'add',
$this->Donor->getLastInsertId()
));
无需返回重定向,因为您被重定向,所以没用。请注意,我们在重定向中将最后插入的记录ID作为get param传递。 The redirect method控制器默认调用_stop(),调用exit()。
CakePHP3:There is a discussion about changing that default behavior in 3.0。看起来在CakePHP 3.0中,redirect()不再默认退出()。
DonationsController:
public function add($donorId = null) {
// Get the donor to display it if you like to
if ($this->request->is('post')) {
$this->request->data['Donation']['donor_id'] = $donorId;
// Save code here
}
}
我不会在这里使用会话,特别是不将它保存为名为“id”的完全无意义和通用的值。如果有的话,我会使用总是有意义的名称和名称空间,例如Donor.lastInsertId作为会话密钥。
如果它们相关,并不总是很清楚放置的地方,但经验法则说事情应该进入他们所属的领域,在这种情况下恕我直言非常清楚。
修改强>
只要其他人需要,就可以在此处进行此编辑 - 它不符合提问者的使用方案。
如果您在此阶段登录用户,请修改add
函数以检查传递的userId是否与登录的相同:
DonationsController:
public function add($donorId = null) {
// Get the donor to display it if you like to
if ($this->request->is('post')) {
if ($this->Auth->user('id') != $donorId) {
throw new InvalidArgumentException();
}
$this->request->data['Donation']['donor_id'] = $donorId;
// Save code here
}
}
答案 1 :(得分:-1)
您可以使用更多带有用途的模型使用相同的控制器。 或者您也可以向另一个使用Ajax和morover的控制器询问以获得对Json的响应。