2014-01-30 189 views
0

我目前正在建设,分别有两种型号,捐助者和捐赠管理模型的Web应用程序。它有多个用户角色。当员工用户首次登记捐赠者,我希望他被重定向到另一种形式,让他填写的捐款的详细信息(供体被注册,一旦第一笔捐款是成功的)。CakePHP - 控制器还是无控制器?

杉杉的是,我应该创建一个捐赠控制器,从中我会使用用户重定向:

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

对于上述工作,它要求我保存新登记的捐献者的ID在会话像这样:

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

因此,用户会被重定向到“捐款/添加”中的URL,这工作得很好。但是我觉得这有一些缺陷。我徘徊是否应该在Donor控制器内创建另一个名为'add_donation'的操作,该操作将具有其各自的'View'。这个想法是能够形成这样一个url:'donors/add_donation/4'(4是donor_id!) 这个URL遵循这个构造:'controller/action/id'

如果有人可以脱落一些关于最佳实践的信息,或者描述我的解决方案(前者,使用会话等)的任何警告,请帮助兄弟出来!我非常感激你!提前致谢!

+0

你正在使用哪个版本的Cake,为什么你给他们三个贴上标签? –

+0

它更可能得到答复(更多追随者)。虽然我当前的版本是5.4.12 ..对不起,如果这是一个不适当的事情,但我绝望在这里! – LogixMaster

+0

@ user2678538只需添加一个额外支票 - 当您使用: ''donors/add_donation/4'(4为donor_id!)'将传递的'donor_id'与'Session-> Auth'中的值进行比较,以便欺骗捐赠者是不可能的。 :D 只有当用户登录后才有可能! 或者更好的是,从'$ this-> Auth-> user();' –

回答

2

后,您救了你可以在DonorsController做到这一点的数据:

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

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

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

我不会在这里使用的会议,特别是不被保存到一个名为“身份证”一个完全没有意义和通用值。如果有的话,我会使用总是有意义的名称和名称空间,例如Donor.lastInsertId作为会话密钥。

这并不总是不清楚的地方放东西,如果他们相关,但凭经验去,事情应该进入他们属于域,这是在这种情况下,恕我直言很清楚。

编辑: 这里离开这个编辑只是如果有人需要它 - 它不符合提问者的使用情境。 如果有用户在这个阶段登录,修改add功能检查,如果传递的用户id是一样的一个登录:

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

获取用户ID,请接受我的感谢!感谢您的回答,并超越我的问题!我没有想过从重定向方法传递id!谢谢! – LogixMaster

+0

@Borislav我认为你误解了这种情况......目前的用户在这个阶段不会是捐助者,但它将成为血库工作人员! – LogixMaster

+0

@ user2678538没问题。然后我的言论是错误的。我没有误解 - 你没有提到这一点。 :) 将删除我的编辑。 –

-1

您还可以使用相同的控制器使用更多的模型。 或者你也可以问与Ajax和morover另一个控制器得到响应与JSON。

+0

感谢您的回答!不过,我有点担心这一点。在这种情况下使用ajax和json是否有点矫枉过正,因为它应该是一个相当简单的过程?! (2个控制器通信) – LogixMaster

+0

我不知道你的网站有什么目标,但是今天最常用的方法是以简单的方式做一步,没有任何重定向。 你可以例如当注册第一步时,通过使用Fancybox的其他步骤...在我看来,重定向不是最好的解决方案,因为我没有看到使用涉及许多控制器,aniway你也可以做到这一点,没有ajax,例如你可以使用方法请求,它允许请求其他控制器接收数组作为回复。 – user2711870

+0

我同意你的意见!我不是一个重新定向自己的巨大粉丝..但这不是一个多步骤注册表格。基本上,工作人员将被要求在捐赠者注册后立即填写第一个捐赠细节。但是,第二种形式(视图),在注册后重定向的情况下,每当捐献者捐献血液时也会用于其他时间,并记录捐赠! :) – LogixMaster