BlogArticlesController.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Events\BlogArticleView;
  4. use App\Models\BlogArticle;
  5. use App\Models\BlogCategory;
  6. use App\Models\BlogTag;
  7. use App\Models\BlogTagsLinkArticle;
  8. use Illuminate\Http\Request;
  9. use App\Http\Controllers\Controller;
  10. use App\Http\Requests\BlogArticleRequest;
  11. use Illuminate\Support\Facades\Auth;
  12. use Illuminate\Support\Facades\DB;
  13. class BlogArticlesController extends Controller
  14. {
  15. public function __construct()
  16. {
  17. $this->middleware('auth', ['except' => ['index', 'show']]);
  18. }
  19. // 列表页
  20. public function index(Request $request)
  21. {
  22. $blog_articles = BlogArticle::withOrder($request->order)
  23. ->select('blog_articles.*', 'images.path as avatar_path')
  24. ->leftJoin('images', function ($join){
  25. $join->on('images.user_id', '=', 'blog_articles.user_id')
  26. ->where('images.image_type', '=', 'avatar');
  27. })->paginate(20);
  28. // $blog_articles = BlogArticle::with(['category', 'user'])->paginate();
  29. return view('pages.blog_articles.index', compact('blog_articles'));
  30. }
  31. // 详情页
  32. public function show(BlogArticle $article)
  33. {
  34. // 更新 文章浏览数
  35. event(new BlogArticleView($article));
  36. // 回复数据
  37. $replies = $article->replies()->with('user')
  38. ->where('verify', '=', 1)
  39. ->select('replies.*', 'images.path as avatar_path')
  40. ->leftJoin('images', function ($join){
  41. $join->on('images.user_id', '=', 'replies.user_id')
  42. ->where('images.image_type', '=', 'avatar');
  43. })->get();
  44. // 文章主体
  45. $article->body = $this->markdownToHtml($article->body);
  46. return view('pages.blog_articles.show', compact('article', 'replies'));
  47. }
  48. // 创建页面
  49. public function create(BlogArticle $article)
  50. {
  51. $this->authorize('admin', $article);
  52. $categories = BlogCategory::all();
  53. $tags = BlogTag::all();
  54. return view('pages.blog_articles.create_and_edit', compact('article', 'categories', 'tags'));
  55. }
  56. // 保存文章
  57. public function store(BlogArticleRequest $request, BlogArticle $article, BlogCategory $category)
  58. {
  59. $this->authorize('admin', $article);
  60. $category_id = $request->category_id;
  61. $user_id = Auth::id();
  62. // 更新 blog_tags 表
  63. $tag_ids = $this->updateTagsTable($request->tags);
  64. $data = [
  65. 'title' => $request->title,
  66. 'body' => $request->body,
  67. 'category_id' => $category_id,
  68. ];
  69. $article->fill($data);
  70. $article->user_id = $user_id;
  71. $article->save();
  72. // 更新 blog_tags_link_articles 表
  73. $article_id = $article->id;
  74. $this->updateTagsLinkArticlesTable($article_id, $tag_ids);
  75. return redirect()->route('blog.articles.show', $article->id)->with('success', '文章创建成功.');
  76. }
  77. // 编辑页面
  78. public function edit(BlogArticle $article)
  79. {
  80. $this->authorize('update', $article);
  81. $categories = BlogCategory::all();
  82. $articleTags = $article->tags()->get()->toArray();
  83. $tmpArr = [];
  84. foreach ($articleTags as $item){
  85. array_push($tmpArr, $item['name']);
  86. };
  87. $articleTags = implode(',', $tmpArr);
  88. $tags = BlogTag::all();
  89. return view('pages.blog_articles.create_and_edit', compact('article', 'categories', 'articleTags', 'tags'));
  90. }
  91. // 更新文章
  92. public function update(BlogArticleRequest $request, BlogArticle $article)
  93. {
  94. $this->authorize('update', $article);
  95. $tag_ids = $this->updateTagsTable($request->tags);
  96. $category_id = $request->category_id;
  97. $data = [
  98. 'title' => $request->title,
  99. 'body' => $request->body,
  100. 'category_id' => $category_id,
  101. ];
  102. $article->update($data);
  103. $article_id = $article->id;
  104. $this->updateTagsLinkArticlesTable($article_id, $tag_ids);
  105. return redirect()->route('blog.articles.show', $article->id)->with('success', '更新成功.');
  106. }
  107. // 删除文章
  108. public function destroy(BlogArticle $article)
  109. {
  110. $this->authorize('destroy', $article);
  111. $article->delete();
  112. return redirect()->route('blog.articles.index')->with('success', '删除成功.');
  113. }
  114. /**
  115. * 更新 blog_tags 表
  116. * @param string $reqTags 提交的 tags 字段
  117. * @return array $tag_ids
  118. */
  119. private function updateTagsTable($reqTags)
  120. {
  121. $tags = new BlogTag();
  122. // 一篇文章对应多个 tag 标签
  123. $tag_ids = [];
  124. // 文章id 只有保存文章后才可以获得文章id
  125. $article_id = null;
  126. // 提交的 tag->name 字段
  127. $reqTags = explode(',', $reqTags);
  128. foreach ($reqTags as $tag){
  129. if (!empty($tag) && !$tags->hasTag($tag)) {
  130. $data = [
  131. 'name'=> $tag,
  132. ];
  133. BlogTag::insert($data);
  134. }
  135. if (!empty($tag)) {
  136. $tag_id = $tags->getTag($tag);
  137. foreach ($tag_id as $item) {
  138. array_push($tag_ids, $item);
  139. }
  140. }
  141. }
  142. return $tag_ids;
  143. }
  144. /**
  145. * 更新 blog_tags_link_articles 表
  146. * @param $article_id
  147. * @param array $tag_ids 通过 `this->updateTagsTable` 获得
  148. */
  149. private function updateTagsLinkArticlesTable($article_id, $tag_ids)
  150. {
  151. $tagsLinkArticles = new BlogTagsLinkArticle();
  152. if (is_numeric($article_id)) {
  153. $tagsLinkArticles->deleteArticleItem($article_id);
  154. foreach ($tag_ids as $item) {
  155. $data = [
  156. 'article_id' => $article_id,
  157. 'tag_id' => $item,
  158. 'user_id'=> Auth::id(),
  159. ];
  160. BlogTagsLinkArticle::insert($data);
  161. }
  162. }
  163. }
  164. }