前提・実現したいこと
PHP・Laravelで簡単な掲示板アプリにコメント機能を実装しています。
フォームに文字を入力しボタンを押したら、その文字が表示されるようにしたいです。
ご教授いただけると幸いです。
発生している問題・エラーメッセージ
詳細ページにてコメントを入力し送信しても、コメントが表示されません。
エラーは出ていないです。
送信後は同じ画面(詳細ページ)が表示されます。
1週間以上悩んでいるのですが、なかなか答えに辿り着けないです。
該当のソースコード
User.php
PHP
1<?php 2 3namespace App; 4 5use Illuminate\Contracts\Auth\MustVerifyEmail; 6use Illuminate\Foundation\Auth\User as Authenticatable; 7use Illuminate\Notifications\Notifiable; 8 9class User extends Authenticatable 10{ 11 use Notifiable; 12 13 /** 14 * The attributes that are mass assignable. 15 * 16 * @var array 17 */ 18 protected $fillable = [ 19 'name', 'email', 'password', 20 ]; 21 22 /** 23 * The attributes that should be hidden for arrays. 24 * 25 * @var array 26 */ 27 protected $hidden = [ 28 'password', 'remember_token', 29 ]; 30 31 /** 32 * The attributes that should be cast to native types. 33 * 34 * @var array 35 */ 36 protected $casts = [ 37 'email_verified_at' => 'datetime', 38 ]; 39}
Article.php
PHP
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6use Illuminate\Database\Eloquent\Relations\BelongsTo; 7use Illuminate\Database\Eloquent\Relations\HasMany; 8 9class Article extends Model 10{ 11 protected $fillable = [ 12 'title', 13 'body', 14 ]; 15 16 public function user(): BelongsTo 17 { 18 return $this->belongsTo('App\User'); 19 } 20 21 public function comments(): HasMany 22 { 23 return $this->HasMany('App\Comment'); 24 } 25}
Comment.php
PHP
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6use Illuminate\Database\Eloquent\Relations\BelongsTo; 7 8class Comment extends Model 9{ 10 protected $fillable = [ 11 'body', 12 ]; 13 14 public function user(): BelongsTo 15 { 16 return $this->belongsTo('App\User'); 17 } 18 19 public function article(): BelongsTo 20 { 21 return $this->belongsTo('App\Article'); 22 } 23}
CommentRequest.php
PHP
1<?php 2 3namespace App\Http\Requests; 4 5use Illuminate\Foundation\Http\FormRequest; 6 7class CommentRequest extends FormRequest 8{ 9 /** 10 * Determine if the user is authorized to make this request. 11 * 12 * @return bool 13 */ 14 public function authorize() 15 { 16 return true; 17 } 18 19 /** 20 * Get the validation rules that apply to the request. 21 * 22 * @return array 23 */ 24 public function rules() 25 { 26 return [ 27 'body' => 'required|max:300', 28 ]; 29 } 30 31 public function attributes() 32 { 33 return [ 34 'body' => '本文', 35 ]; 36 } 37}
ArticleController.php
PHP
1<?php 2 3namespace App\Http\Controllers; 4 5use App\Article; 6use App\Comment; 7use App\Http\Requests\ArticleRequest; 8use Illuminate\Http\Request; 9 10class ArticleController extends Controller 11{ 12 public function __construct() 13 { 14 $this->authorizeResource(Article::class, 'article'); 15 } 16 17 public function index(Request $request) 18 { 19 $search = $request->input('search'); 20 $query = Article::query(); 21 22 if (!empty($search)) { 23 $query->where('title', 'LIKE', "%{$search}%") 24 ->orWhere('body', 'LIKE', "%{$search}%"); 25 } 26 27 $articles = $query->get()->sortByDesc('created_at'); 28 29 return view('articles.index', ['articles' => $articles]); 30 } 31 32 public function create() 33 { 34 return view('articles.create'); 35 } 36 37 public function store(ArticleRequest $request, Article $article) 38 { 39 $article->fill($request->all()); 40 $article->user_id = $request->user()->id; 41 $article->save(); 42 return redirect()->route('articles.index'); 43 } 44 45 public function edit(Article $article) 46 { 47 return view('articles.edit', ['article' => $article]); 48 } 49 50 public function update(ArticleRequest $request, Article $article) 51 { 52 $article->fill($request->all())->save(); 53 return redirect()->route('articles.index'); 54 } 55 56 public function destroy(Article $article) 57 { 58 $article->delete(); 59 return redirect()->route('articles.index'); 60 } 61 62 public function show(Article $article, Comment $comment) 63 { 64 $comments = $article->comments()->orderBy('created_at', 'desc'); 65 return view('articles.show', ['article' => $article, 'comments' => $comments]); 66 } 67}
CommentController.php(storeアクションメソッド以外はまだ実装していないです。)
PHP
1<?php 2 3namespace App\Http\Controllers; 4 5use App\Comment; 6use App\Http\Requests\CommentRequest; 7use Illuminate\Http\Request; 8 9class CommentController extends Controller 10{ 11 public function store(CommentRequest $request, Comment $comment) 12 { 13 $comment->fill($request->all()); 14 $comment->user_id = $request->user()->id; 15 $comment->article_id = $request->article()->id; 16 $comment->save(); 17 return redirect()->route('articles.show'); 18 } 19 20 public function edit() 21 { 22 // 23 } 24 25 public function update() 26 { 27 // 28 } 29 30 public function destroy() 31 { 32 // 33 } 34}
show.blade.php
PHP
1@extends('app') 2 3@section('title', '詳細ページ') 4 5@section('content') 6 @include('nav') 7 <div class="container"> 8 @include('articles.card') 9 </div> 10 11 @auth 12 <form method="POST" action="{{ route('comments.store') }}"> 13 @csrf 14 <input type="hidden" name="article_id" value="{{ $article->id }}"> 15 <textarea class="form-control" name="comment" rows="4" placeholder="コメントを入力してください。">{{ old('comment') }}</textarea> 16 <button type="submit" class="btn blue-gradient btn-block"> 17 コメントする 18 </button> 19 </form> 20 @endauth 21 22 <div class=h4>コメント一覧</div> 23 @forelse($comments as $comment) 24 <div> 25 {!! nl2br(e($comment->comment)) !!} 26 </div> 27 @empty 28 <p>コメントはまだありません。</p> 29 @endforelse 30@endsection
試したこと
①mysqlにデータが保存されているか確認
SQLで下記を実行しました
mysql> SELECT id, body FROM comments ORDER BY id; Empty set (0.01 sec)
データが保存されていないことがわかりました。
②CommentController.phpのstoreアクションメソッドの編集
コメントフォームで入力した値が保存できていないということは、CommentController.phpのstoreアクションに原因があると考えました。
storeアクションメソッドを色々編集してみました。
正直まだ理解が浅いので、的外れなことを書いてるかもしれません。
PHP
1//パターン1 2$user = auth()->user(); 3$comment->fill($request->all()); 4$comment->user_id = $request->user()->id; 5$comment->user_id = $user->id; 6$comment->save(); 7return redirect()->route('articles.show'); 8 9//パターン2 10$comment->fill($request->all()); 11$comment = new Comment(); 12$comment->body = $request->body; 13$comment->save(); 14return redirect()->route('articles.show'); 15 16//パターン3 17$comment = new Comment; 18$input = $request->only($comment->getFillable()); 19$comment = $comment->create($input); 20$comment->save(); 21return redirect('/');
特に変化はありませんでした。
③dd($comment);
で変数の中を確認。
ヘルパ関数のddを使用して、storeアクションメソッドの$commentの内容を表示しようとしました。
結果としては、dd自体が実行されず、詳細ページが表示されました。
④ArticleController.phpのshowアクションメソッドの編集
ArticleController.phpのshowアクションメソッドを抜粋
PHP
1public function show(Article $article, Comment $comment) 2{ 3 $comments = $article->comments()->orderBy('created_at', 'desc'); 4 return view('articles.show', ['article' => $article, 'comments' => $comments]); 5}
ある方のGitHubを参考にしながら、自分なりにアレンジして書いてます。
showメソッドの引数が$comment
で、関数の中身のほうが$comments
で、なぜ動くのかが理解できていないです。
$comment
を$comments
にしたり、$comments
を$comment
にしたりしてみましたが、特に変化はありませんでした。
補足情報(FW/ツールのバージョンなど)
PHP 7.4.1
Laravel 6.20.26
Docker 20.10.6
docker-compose 1.29.1
WindowsOS
回答1件
あなたの回答
tips
プレビュー