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