我有两个型号,Dealer
和DealerReview
我想创建一个表单,从DealersController的View操作添加DealerReview。在cakepp中实现这一点的推荐方法是什么?Do i:
a) 在DealersController视图操作中创建表单,但将数据发布到DealerReviewsController
添加操作?或
b) 将添加审核数据直接发布到DealersController
,查看操作并从那里将记录添加到数据库?
真的取决于你。。。
当你选择一种或另一种方式时,你必须记住的是:
对于a)
-与评审相关的经销商是否已经创建?如果没有,您将如何将外键dealer_id添加到DealerReviews以将两者关联起来?
对于b)
-如果没有创建经销商(当然,如果您先添加经销商的创建),这将消除没有正确外键的问题
-如果您计划从其他地方添加评论,则不能重用addDealerReviews逻辑。
我通常所做的只是将数据直接发布到主控制器(在这种情况下是经销商)。省去了我在添加评论之前必须检查经销商是否正确保存和验证的麻烦。
如果在保存Review之前需要考虑一个业务逻辑(比如它只能在凌晨2点到3点之间保存(我知道这个愚蠢的例子)),那么我会在beforeSave
中添加验证。
如果它是一个一次或两次的业务逻辑,我在模型中创建一个新函数saveButOnlyInSomeCasesLogic($reviewArray)
,并让它处理这些情况,控制器只调用该函数并等待结果。
总之:如果需要,选择允许您重用代码的选项。如果您总是有外键可用,请在Reviews控制器中执行,您可能需要重用添加操作。如果您绝对不会重复使用添加操作,或者在保存时没有可用的外键,请在经销商中保存,并在模型中保留保存逻辑(如果有的话)。
使用您的关联来保存它。你可以说一个经销商有很多经销商的新闻。所以在这种情况下,我只需要从您的经销商控制器视图调用save。
$this->Dealer->DealerReview->save($this->request->data);
这样,您的表格就可以像您想要的那样放在经销商控制器中。
我想补充一下,这取决于具体的用例。
原因如下:
如果评审表单包含多个字段(但即使您有一个用于评审的文本区域,您也需要验证用户是否提交了空评审)。如果是这样,错误的话,您需要返回相同的表单(预先填充了发布的数据),并最终返回到同一页面上。因此,在相同的操作中张贴表格将起到正常添加或编辑表格的作用。
或者,如果您使用的是ajax表单提交,那么我会使用DealersController:add()方法,调用的响应将在原始表单的位置呈现,但这次出现了验证错误。这需要一点调整,因为您需要检测调用是否来自ajax,这样就不会将添加操作重定向到索引。这里最大的好处是用户不需要刷新页面。
所以,如果你不使用ajax,我会在DealersController::view()中发帖,但如果你使用ajax,那么使用DealersReviewsControlleer::add()会更有用,你可以重用该方法,用户也不必刷新页面。
正如@Nunser所说——这取决于你。:)