我开始编写新网站的代码,例如电子商务,但这只是一个评论网站,用户可以评论品牌,产品和品牌帖子。因此,我有一个用于注释的多态表。
当有人尝试添加评论时,首先,我需要定义评论类型,例如品牌,产品或帖子。在这种情况下,我使用开关盒来了解用户想要做什么。我认为使用干净的代码结构会有更好的方法,这就是为什么我在这里。
我只想知道这是否是添加注释的正确方法,如下所示。
public function addComment(Request $request, $type, $id, $tab = null)
{
// Error messages
$messages = [
'add_comment.required' => '...',
'add_comment.min' => '...',
'add_comment.max' => '...',
'rating.numeric' => '...',
'rating.min' => '...',
'rating.max' => '...'
];
// Validate the form data
$validator = Validator::make($request->all(), [
'add_comment' => 'required|min:5|max:2000',
'rating' => 'numeric|min:0|max:5'
], $messages);
if($validator->fails())
{
return back()->withErrors($validator);
} else {
$comment = new Comment;
$comment->body = $request->get('add_comment');
$comment->user()->associate(Auth::user()->id);
$comment->star_value = $request->get('rating');
switch ($type) {
case 'Post':
$post = Post::findOrFail($id);
$comment->star_value = NULL;
$post->comments()->save($comment);
break;
case 'Product':
$product = Product::findOrFail($id);
$product->comments()->save($comment);
//Update rating of product
$average = $product->comments()->getAvg();
$product->rating = $average;
$product->save();
break;
default:
$this->postCommentToBrand($comment, $id, $tab);
break;
}
return redirect()->back();
}
}
$ request =输入
$ type = commentable_type(品牌,产品,邮政)
$ id = $ type的ID
$ tab =这实际上是针对品牌的。因为品牌有客户支持和技术支持。还需要在其中使用开关盒来定义它。
答案 0 :(得分:2)
将其拆分为单独的路由-每种可注释类型分别路由,例如:
Route::post('add-comment/post/{post}', 'CommentsController@addPostComment');
Route::post('add-comment/product/{product}', 'CommentsController@addProductComment');
Route::post('add-comment/brand/{brand}/{tab}', 'CommentsController@addBrandComment');
这将解决您的switch
的问题-现在Laravel的路由器会立即看到您要添加评论的可评论实体的类型。路由器还将利用implicit model binding并通过指定的ID为您查找那些模型(如果您的数据库中不存在该行,则返回404),因此我们也摆脱了那些讨厌的findOrFail
调用。
现在,在控制器中,您应该利用form requests for validation(而不是手动创建Validator
实例)。最后,我们可以将创建新Comment
实例(所有可注释类型共有)的逻辑分组到单独的方法中。然后您的控制器将如下所示:
protected function getNewCommentFromRequest(Request $request)
{
$comment = new Comment;
$comment->body = $request->get('add_comment');
$comment->user()->associate(Auth::user()->id);
$comment->star_value = $request->get('rating');
return $comment;
}
public function addPostComment(AddCommentRequest $request, Post $post)
{
$comment = $this->getNewCommentFromRequest($request);
$comment->star_value = NULL;
$post->comments()->save($comment);
return redirect()->back();
}
...
方法addProductComment
和addBrandComment
没什么不同。