kenken999/php
0
1<?php2 3namespace App\Http\Controllers;4 5use App\Http\Requests\Article\DestroyRequest;6use App\Http\Requests\Article\FeedRequest;7use App\Http\Requests\Article\IndexRequest;8use App\Http\Requests\Article\StoreRequest;9use App\Http\Requests\Article\UpdateRequest;10use App\Http\Resources\ArticleCollection;11use App\Http\Resources\ArticleResource;12use App\Models\Article;13use App\Models\User;14use App\Services\ArticleService;15 16class ArticleController extends Controller17{18 protected Article $article;19 protected ArticleService $articleService;20 protected User $user;21 22 public function __construct(Article $article, ArticleService $articleService, User $user)23 {24 $this->article = $article;25 $this->articleService = $articleService;26 $this->user = $user;27 }28 29 public function index(IndexRequest $request): ArticleCollection30 {31 return new ArticleCollection($this->article->getFiltered($request->validated()));32 }33 34 public function feed(FeedRequest $request): ArticleCollection35 {36 return new ArticleCollection($this->article->getFiltered($request->validated()));37 }38 39 public function show(Article $article): ArticleResource40 {41 return $this->articleResponse($article);42 }43 44 public function store(StoreRequest $request): ArticleResource45 {46 $article = auth()->user()->articles()->create($request->validated()['article']);47 48 $this->syncTags($article);49 50 return $this->articleResponse($article);51 }52 53 public function update(Article $article, UpdateRequest $request): ArticleResource54 {55 $article->update($request->validated()['article']);56 57 $this->syncTags($article);58 59 return $this->articleResponse($article);60 }61 62 public function destroy(Article $article, DestroyRequest $request): void63 {64 $article->delete();65 }66 67 public function favorite(Article $article): ArticleResource68 {69 $article->users()->attach(auth()->id());70 71 return $this->articleResponse($article);72 }73 74 public function unfavorite(Article $article): ArticleResource75 {76 $article->users()->detach(auth()->id());77 78 return $this->articleResponse($article);79 }80 81 protected function syncTags(Article $article): void82 {83 $this->articleService->syncTags($article, $this->request->validated()['article']['tagList'] ?? []);84 }85 86 protected function articleResponse(Article $article): ArticleResource87 {88 return new ArticleResource($article->load('user', 'users', 'tags', 'user.followers'));89 }90}91 