article = $article; $this->articleService = $articleService; $this->user = $user; } public function index(IndexRequest $request): ArticleCollection { return new ArticleCollection($this->article->getFiltered($request->validated())); } public function feed(FeedRequest $request): ArticleCollection { return new ArticleCollection($this->article->getFiltered($request->validated())); } public function show(Article $article): ArticleResource { return $this->articleResponse($article); } public function store(StoreRequest $request): ArticleResource { $article = auth()->user()->articles()->create($request->validated()['article']); $this->syncTags($article); return $this->articleResponse($article); } public function update(Article $article, UpdateRequest $request): ArticleResource { $article->update($request->validated()['article']); $this->syncTags($article); return $this->articleResponse($article); } public function destroy(Article $article, DestroyRequest $request): void { $article->delete(); } public function favorite(Article $article): ArticleResource { $article->users()->attach(auth()->id()); return $this->articleResponse($article); } public function unfavorite(Article $article): ArticleResource { $article->users()->detach(auth()->id()); return $this->articleResponse($article); } protected function syncTags(Article $article): void { $this->articleService->syncTags($article, $this->request->validated()['article']['tagList'] ?? []); } protected function articleResponse(Article $article): ArticleResource { return new ArticleResource($article->load('user', 'users', 'tags', 'user.followers')); } }