実装した部分
Laravel 8.25.0 にて簡単な掲示板を作成しています。
Thread、Post、Userモデルを作成してマイグレーション、それぞれテーブルを作りました。
Userはユーザーの「id」「パスワード」
Threadは「Thread制作番号(id)」「製作者のユーザーid」
Postは書き込みの情報で「Thread制作番号」「投稿者のユーザーid」など
をそれぞれ保存するように設計しました。
また、ログイン機能を作りbladeで{{ Auth::user() }}によってログインしているユーザー情報が見られるようにしました。
「example.com/thread/id=1」を叩くとThreadテーブルのThread制作番号(id)が1であるThreadのデータとPostのデータを取得してbladeに渡します。
そして、Auth::user()->id と Postの投稿者のユーザーidが一致したときのみ、編集ボタン/削除ボタンが表示されるようにしました。
ここで問題が発生しています。
起こっていること
viewではbladeテンプレートを使用していますが、テンプレートの部分と@yieldを使用した部分で{{ Auth::user() }}のふるまいが異なる場合があります。
◆仮定
・認証中のユーザーのidを'logged_in'とします。
・Post投稿者のユーザーのidを'creater'とします。
・テンプレート側のlayouts.app.blade.phpと、そのcontent側のthread.blade.phpの両方に{{ Auth::user() }}を記述します。
<!-- layouts.app.blade.php --> {{ Auth::user()->id }} <!-- thread.blade.php --> {{ Auth::user()->id }}
◆実証
・example.com/thread/id=1を叩いた際に、PostテーブルのThread制作番号カラムが1のデータが存在しない場合
ブラウザ上の表示は
'logged_in'
'logged_in'
となり、問題ありません。一方、
・example.com/thread/id=1を叩いた際に、PostテーブルのThread制作番号カラムが1のデータが存在する場合
ブラウザ上の表示は
'creater'
'logged_in'
となり、テンプレート側のidがPost投稿者のものに書き換えられてしまっています。
そして、content側で「Auth::user()->id と Postの投稿者のユーザーidが一致したとき」の評価を行うif文を書いても、なぜか Auth::user()-id の部分は'creater'として評価されてしまいます。
つまり、ログインしたユーザーidでなく、Postしたユーザーidでこのif文を評価してしまい、どの
ユーザーでも編集/削除ボタンが表示されてしまいます。
なお、Auth::user()に上書きされてしまうのはidだけで、その他の情報は上書きされていません。
また、あくまでthread/id= のときのみ上書きされ、別のページに遷移すると本来ログインしていた'logged_in'の正しいidが表示されます。
解決したいこと
example.com/thread/id=1を叩いた際にどんな条件でもAuth::user()->idが想定通りログインしているアカウントのものが表示できるようにしたく存じています。
原因がコントローラーなのかbladeなのかの判別もできず、ネットで調べてみたものの似た事例を見つけることができなかったためこちらに質問させていただきました。
お力添えいただけますと幸いです。
ドキュメントルート
web.php
php
1Route::GET('/thread', 'App\Http\Controllers\ThreadController@index'); 2Route::GET('/thread/id={id}', 'App\Http\Controllers\PostController@index'); 3Route::POST('/thread/new_post', 'App\Http\Controllers\PostController@store')->middleware('auth');; 4
PostController
App/Http/Controllers/PostController.php
php
1<?php 2 3namespace App\Http\Controllers; 4 5use App\Models\thread; 6use App\Models\Post; 7use Illuminate\Http\Request; 8 9class PostController extends Controller 10{ 11 /** 12 * Display a listing of the resource. 13 * 14 * @return \Illuminate\Http\Response 15 */ 16 public function index(Request $request) 17 { 18 $thread_no = $request->id; 19 $thread = Thread::findOrFail($thread_no); 20 $posts = Post::where("thread_no", $thread_no)->get(); 21 return view('thread')->with([ 22 'thread' => $thread, 23 'posts' => $posts, 24 ]); 25 } 26 //略 27}
回答1件
あなたの回答
tips
プレビュー