CakePHP - 控制器还是没有控制器?

时间:2014-01-30 21:44:40

标签: php cakephp cakephp-2.0 cakephp-2.1 cakephp-2.3

我目前正在构建一个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'

如果有人能够对最佳做法有所了解,或者向我的解决方案(前者,使用会话等)描述任何警告,请帮助兄弟!我要深深感激你!提前谢谢!

2 个答案:

答案 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的响应。