質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

Q&A

解決済

1回答

2216閲覧

Laravel ver.8 Auth::user()の中身が場合によって変わってしまうので困っています。

wcymn

総合スコア8

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

0グッド

0クリップ

投稿2021/03/19 03:20

編集2021/03/19 12:04

実装した部分

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kawax

2021/03/19 04:42

ルーティングやコントローラーのコードも書かないと他人には分からない。
guest

回答1

0

自己解決

Blade内でのif文での評価をしようとした際、本来「==」とするべきところを「=」と
表記していることに気が付きました。

お騒がせいたしました。

投稿2021/03/24 11:58

wcymn

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問