前提
laravelでsnsっぽいアプリを作成している者です。
いいね機能を作成しようと思っているのですが、上手くいってない状態です。
- 以下の記事を参考にして、作成しました
- Laravel いいね機能の実装方法・ログイン版とログインなし版
- Laravelでいいね機能を実装しよう
実現したいこと
-
画面A -> 画面B -> 画面Aのような画面遷移をさせたい
-
画面Aから画面Bへはpost処理はさせずに、getアクセスのみをさせたい
-
画面Bにアクセスしたら、画面Aにリダイレクトさせたい
-
post処理を使わずに、getのみでできるようにしたい(postでも実現できるが、できるならgetでの実現方法を学びのために知りたいため)
-
どなたかよろしくお願い致します。
発生している問題・エラーメッセージ
- 画面Aから画面Bにリンクを貼って、画面遷移させた後に、処理を行わせたら、再び画面Aにリダイレクトさせたいです。
- しかし、ここで画面描画は変わるのですが、urlが画面Bのままです。
- 以下のような挙動になってしまいます。
- いいねを押したとき(いいねを追加したいとき)
- いいねを取り消したいとき
- 無限ループに陥っているのかなと思うのですが、どの部分が原因かは見当がつかない状態です。
該当のソースコード
- MemoGoodController.php
php
1class MemoGoodController extends Controller 2{ 3 /** 4 * メモのいいね機能 5 * @param String $memoId 6 * @return \\Illuminate\\Http\\RedirectResponse 7 */ 8 public function like(String $memoId): RedirectResponse 9 { 10 $user = app(User::class); 11 $userId = $user->getAuthAccountId(); 12 13 $memoGood = MemoGood::onlyTrashed()->where("memo_id", $memoId)->where("user_id", $userId)->first(); 14 if ($memoGood) { 15 $memoGood->restore(); 16 $memoGood->user_id = $userId; 17 $memoGood->memo_id = $memoId; 18 $memoGood->updated_at = Carbon::now(); 19 } else { 20 $memoGood = new MemoGood(); 21 $memoGood->user_id = $userId; 22 $memoGood->memo_id = $memoId; 23 $memoGood->created_at = Carbon::now(); 24 $memoGood->updated_at = Carbon::now(); 25 } 26 27 $memoGood->save(); 28 29 return redirect()->back(); 30 } 31 32 /** 33 * メモのいいねを取り消す機能 34 * @param String $memoId 35 * @return \\Illuminate\\Http\\RedirectResponse 36 */ 37 public function unlike(String $memoId): RedirectResponse 38 { 39 // TODO: 削除のときに、なぜか複数のレコードが登録されてしまう(37個くらい) 40 $user = app(User::class); 41 $userId = $user->getAuthAccountId(); 42 43 $memoGood = MemoGood::where("memo_id", $memoId)->where("user_id", $userId)->first(); 44 if ($memoGood) { 45 $memoGood->delete(); 46 } 47 48 return redirect()->back(); 49 } 50 51} 52
- show.blade.php
html
1@if ($memoLike) 2 <p>hello</p> 3 <a href="{{ route('memo_unlike', $memo->id) }}" class="btn btn-success btn-sm"> 4 いいね 5 <span class="badge"> 6 {{ $memo->memoGoods->count() }} 7 </span> 8 </a> 9@else 10 <p>world</p> 11 <a href="{{ route('memo_like', $memo->id) }}" class="btn btn-success btn-sm"> 12 いいね 13 <span class="badge"> 14 {{ $memo->memoGoods->count() }} 15 </span> 16 </a> 17@endif 18
- MemoController.php
php
1/** 2 * メモの詳細画面 3 * @param Illuminate\Http\Request $request 4 * @param \App\Models\Memo $memo 5 * @return Illuminate\View\View 6 */ 7public function show(Request $request, Memo $memo) 8{ 9 $user = app(User::class); 10 $userId = $user->getAuthAccountId(); 11 12 $memoLike = MemoGood::where('memo_id', $memo->id)->where('user_id', $userId)->first(); 13 return view('memos.show', [ City::CITY_ID_NAME => $request->cityId, Memo::MEMO_ID_NAME => $memo, MemoGood::MEMO_LIKE => $memoLike ]); 14}
- web.php
php
1Route::get('/memo_like/{id}', [MemoGoodController::class ,'like'])->name('memo_like'); 2Route::get('/memo_unlike/{id}', [MemoGoodController::class, 'unlike'])->name('memo_unlike');
試したこと
redirect()->back()
じゃなく、url()->previous()
を使ってみましたが、動作は変わらずでした。- メモのいいね機能だけでなく、別のページである「mypage → リンク先 → mypage」でも同じ状況になる
- 「mypage → リンク先 → memos.index」などでも同じ状況になる
redirect()->back()
じゃなく、redirect()->route('mypage')
などでも、同じ状態になる- リダイレクト先を
https://google.com
などの外部サイトにしたら、上手く動作するが、自分のアプリ内のurlだと上手く動作しない- 以下リダイレクト先をgoogle.comにした場合
補足情報(FW/ツールのバージョンなど)
- Intel MacOS 12.2.1
- laravel 8.78.0
- laravel-breeze
- docker
- vscode
あなたの回答
tips
プレビュー