前提
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
class MemoGoodController extends Controller { /** * メモのいいね機能 * @param String $memoId * @return \\Illuminate\\Http\\RedirectResponse */ public function like(String $memoId): RedirectResponse { $user = app(User::class); $userId = $user->getAuthAccountId(); $memoGood = MemoGood::onlyTrashed()->where("memo_id", $memoId)->where("user_id", $userId)->first(); if ($memoGood) { $memoGood->restore(); $memoGood->user_id = $userId; $memoGood->memo_id = $memoId; $memoGood->updated_at = Carbon::now(); } else { $memoGood = new MemoGood(); $memoGood->user_id = $userId; $memoGood->memo_id = $memoId; $memoGood->created_at = Carbon::now(); $memoGood->updated_at = Carbon::now(); } $memoGood->save(); return redirect()->back(); } /** * メモのいいねを取り消す機能 * @param String $memoId * @return \\Illuminate\\Http\\RedirectResponse */ public function unlike(String $memoId): RedirectResponse { // TODO: 削除のときに、なぜか複数のレコードが登録されてしまう(37個くらい) $user = app(User::class); $userId = $user->getAuthAccountId(); $memoGood = MemoGood::where("memo_id", $memoId)->where("user_id", $userId)->first(); if ($memoGood) { $memoGood->delete(); } return redirect()->back(); } }
- show.blade.php
html
@if ($memoLike) <p>hello</p> <a href="{{ route('memo_unlike', $memo->id) }}" class="btn btn-success btn-sm"> いいね <span class="badge"> {{ $memo->memoGoods->count() }} </span> </a> @else <p>world</p> <a href="{{ route('memo_like', $memo->id) }}" class="btn btn-success btn-sm"> いいね <span class="badge"> {{ $memo->memoGoods->count() }} </span> </a> @endif
- MemoController.php
php
/** * メモの詳細画面 * @param Illuminate\Http\Request $request * @param \App\Models\Memo $memo * @return Illuminate\View\View */ public function show(Request $request, Memo $memo) { $user = app(User::class); $userId = $user->getAuthAccountId(); $memoLike = MemoGood::where('memo_id', $memo->id)->where('user_id', $userId)->first(); return view('memos.show', [ City::CITY_ID_NAME => $request->cityId, Memo::MEMO_ID_NAME => $memo, MemoGood::MEMO_LIKE => $memoLike ]); }
- web.php
php
Route::get('/memo_like/{id}', [MemoGoodController::class ,'like'])->name('memo_like'); Route::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
まだ回答がついていません
会員登録して回答してみよう