【问题标题】:CakePHP - Controller or No Controller?CakePHP - 控制器还是无控制器?
【发布时间】:2014-01-30 21:44:39
【问题描述】:

我目前正在构建一个网络应用程序,它有两个模型,分别是 Donor 和 Donation Models。它有多个用户角色。当员工用户第一次注册捐赠者时,我希望他被重定向到另一个允许他填写捐赠详细信息的表格(捐赠者在第一次捐赠成功后注册)。

首先,我是否应该创建一个捐赠控制器,并使用以下方式重定向用户:

return $this->redirect(array('controller'=>'donations','action'=>'add'));

要使上述方法起作用,我需要将新注册的捐助者的 ID 保存在这样的会话中:

$this->Session->write('id', $this->Donor->id);

所以用户被重定向到 url 中的“捐赠/添加”,这很好用。但是我认为这有一些缺陷。我在徘徊是否应该在 Donor 控制器中创建另一个名为“add_donation”的操作,该操作将具有其各自的“视图”。这个想法是能够形成这样的网址:'donors/add_donation/4'(4是donors_id!) 此 URL 遵循以下结构:'controller/action/id'

如果有人可以阐明最佳实践,或描述我的解决方案的任何警告(前者,使用会话等),请帮助兄弟!我会深深地感激你!提前致谢!

【问题讨论】:

  • 您使用的是哪个版本的 Cake,为什么要标记其中三个?
  • 它更有可能得到回复(更多关注者)。我目前的版本是 5.4.12.. 抱歉,如果这样做不合适,但我在这里绝望!
  • @user2678538 只需添加额外的检查 - 当您使用时:'donors/add_donation/4' (4 being the donor_id ! ) 将传递的 donor_idSession->Auth 中的比较,这样就不可能欺骗捐赠者。 :D 这只有在用户登录时才有可能!或者更好的是,从$this->Auth->user();获取用户ID

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


【解决方案1】:

保存数据后,您可以在 DonorsController 中执行此操作:

$this->redirect(array(
   'controller' => 'donations',
   'action' => 'add',
   $this->Donor->getLastInsertId()
));

没有必要返回一个重定向,它是无用的,因为你被重定向了。请注意,我们将最后插入的记录 id 作为重定向中的 get 参数传递。 The redirect method 的控制器默认调用 _stop(),它调用 exit()。

CakePHP3:There is a discussion about changing that default behavior in 3.0。看起来在 CakePHP 3.0 中,默认情况下 redirect() 将不再 exit() 。

捐赠控制器:

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是否和登录的一样:

捐赠控制器:

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
   } 
}

【讨论】:

  • 请接受我的感谢!感谢您的回答,也超越了我的问题!我没想到从重定向方法中传递 id !谢谢!
  • @Borislav 我想你误解了这个场景……当前用户现阶段不会是献血者,而是血库工作人员!
  • @user2678538 好的。那么我的言论是错误的。我没有误解——你没有提到这一点。 :) 将删除我的编辑。
  • @BorislavSabev 是的,你是对的。请原谅我的不准确!但是非常感谢您仍然有见地的回答。我一直在学习1
【解决方案2】:

您还可以使用相同的控制器来使用更多型号。 或者您也可以使用 Ajax 和 morover 向另一个控制器请求 Json 响应。

【讨论】:

  • 感谢您的回答!不过我有点担心这个。在这种情况下使用 ajax 和 json 是不是有点矫枉过正,考虑到它应该是一个相当简单的过程?! (2 个控制器通信)
  • 我不知道您的网站有什么目标,但无论如何,现在最常用的方法是以简单的方式进行,无需任何重定向。例如,您可以在注册第一步时,使用fancybox 传递另一个步骤...在我看来重定向不是最好的解决方案,因为我认为不需要涉及许多控制器,但您也可以在没有ajax 的情况下做到这一点,例如,您可以使用请求方法,该方法允许向接收数组作为回复的其他控制器发出请求。
  • 我同意你的看法!我不是重定向自己的忠实粉丝。但这不是一个多步骤的注册表单。基本上,一旦捐赠者注册,工作人员将被要求填写第一个捐赠详细信息。但是第二种形式(视图),我在注册后重定向的地方,也将用于献血者献血的其他时间,并记录献血! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 2013-09-19
  • 2013-04-08
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多