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

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

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

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

Q&A

1回答

1406閲覧

Laravelのミドルウェアの実行順とAuthファサードについて

irithyll

総合スコア14

Laravel

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

0グッド

0クリップ

投稿2022/11/11 03:01

編集2022/11/11 03:06

前提

Laravelの自作ミドルウェアで認証済みのユーザーIDをログとして出力したいと考えています。
ミドルウェアの追加した場所によってユーザーIDが取得できたりできなかったりするので、詳細を教えていただきたいです。

  • 自作したミドルウェア

php:app/Http/AccessLogger.php

1<?php 2 3namespace App\Http\Middleware; 4 5use Closure; 6use Illuminate\Http\Request; 7use Illuminate\Support\Facades\Auth; 8use Illuminate\Support\Facades\Log; 9 10 11class AccessLogger 12{ 13 /** 14 * Handle an incoming request. 15 * 16 * @param \Illuminate\Http\Request $request 17 * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next 18 * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse 19 */ 20 public function handle(Request $request, Closure $next) 21 { 22 Log::info('userId:' . Auth::id()); 23 24 return $next($request); 25 } 26}
  • ミドルウェアの登録(idが取得できないパターン)

php:app/Http/Kernel.php

1<?php 2 3namespace App\Http; 4 5use Illuminate\Foundation\Http\Kernel as HttpKernel; 6 7class Kernel extends HttpKernel 8{ 9 /** 10 * The application's global HTTP middleware stack. 11 * 12 * These middleware are run during every request to your application. 13 * 14 * @var array<int, class-string|string> 15 */ 16 protected $middleware = [ 17 // \App\Http\Middleware\TrustHosts::class, 18 \App\Http\Middleware\TrustProxies::class, 19 \Illuminate\Http\Middleware\HandleCors::class, 20 \App\Http\Middleware\PreventRequestsDuringMaintenance::class, 21 \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, 22 \App\Http\Middleware\TrimStrings::class, 23 \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, 24 ]; 25 26 /** 27 * The application's route middleware groups. 28 * 29 * @var array<string, array<int, class-string|string>> 30 */ 31 protected $middlewareGroups = [ 32 'web' => [ 33 \App\Http\Middleware\EncryptCookies::class, 34 \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 35 \Illuminate\Session\Middleware\StartSession::class, 36 \Illuminate\View\Middleware\ShareErrorsFromSession::class, 37 \App\Http\Middleware\VerifyCsrfToken::class, 38 \App\Http\Middleware\AccessLogger::class, // 追加 39 \Illuminate\Routing\Middleware\SubstituteBindings::class, 40 ], 41 42 'api' => [ 43 // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 44 'throttle:api', 45 \Illuminate\Routing\Middleware\SubstituteBindings::class, 46 ], 47 ]; 48 49 /** 50 * The application's route middleware. 51 * 52 * These middleware may be assigned to groups or used individually. 53 * 54 * @var array<string, class-string|string> 55 */ 56 protected $routeMiddleware = [ 57 'auth' => \App\Http\Middleware\Authenticate::class, 58 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 59 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, 60 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 61 'can' => \Illuminate\Auth\Middleware\Authorize::class, 62 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 63 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 64 'signed' => \App\Http\Middleware\ValidateSignature::class, 65 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 66 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 67 ]; 68}
  • ログ出力結果
[2022-11-11 02:45:38] local.INFO: userId:
  • ミドルウェアの登録(idが取得できるパターン)

php:app/Http/Kernel.php

1<?php 2 3namespace App\Http; 4 5use Illuminate\Foundation\Http\Kernel as HttpKernel; 6 7class Kernel extends HttpKernel 8{ 9 /** 10 * The application's global HTTP middleware stack. 11 * 12 * These middleware are run during every request to your application. 13 * 14 * @var array<int, class-string|string> 15 */ 16 protected $middleware = [ 17 // \App\Http\Middleware\TrustHosts::class, 18 \App\Http\Middleware\TrustProxies::class, 19 \Illuminate\Http\Middleware\HandleCors::class, 20 \App\Http\Middleware\PreventRequestsDuringMaintenance::class, 21 \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, 22 \App\Http\Middleware\TrimStrings::class, 23 \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, 24 ]; 25 26 /** 27 * The application's route middleware groups. 28 * 29 * @var array<string, array<int, class-string|string>> 30 */ 31 protected $middlewareGroups = [ 32 'web' => [ 33 \App\Http\Middleware\EncryptCookies::class, 34 \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 35 \Illuminate\Session\Middleware\StartSession::class, 36 \Illuminate\View\Middleware\ShareErrorsFromSession::class, 37 \App\Http\Middleware\VerifyCsrfToken::class, 38 \Illuminate\Routing\Middleware\SubstituteBindings::class, 39 \App\Http\Middleware\AccessLogger::class, // 追加 40 ], 41 42 'api' => [ 43 // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 44 'throttle:api', 45 \Illuminate\Routing\Middleware\SubstituteBindings::class, 46 ], 47 ]; 48 49 /** 50 * The application's route middleware. 51 * 52 * These middleware may be assigned to groups or used individually. 53 * 54 * @var array<string, class-string|string> 55 */ 56 protected $routeMiddleware = [ 57 'auth' => \App\Http\Middleware\Authenticate::class, 58 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 59 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, 60 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 61 'can' => \Illuminate\Auth\Middleware\Authorize::class, 62 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 63 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 64 'signed' => \App\Http\Middleware\ValidateSignature::class, 65 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 66 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 67 ]; 68}
  • ログ出力結果
[2022-11-11 02:46:12] local.INFO: userId:1

AccessLoggerをSubstituteBindingsより前に登録するとユーザーIDが取得できず、後に登録するとユーザーIDが取得できます。
何度か試しましたが結果は同じでした。

お聞きしたいこと

お聞きしたいのは2点です。

  • $middlewarePriorityを設定しない場合、$middlewareGroups内の実行順は記述した順なのか
  • SubstituteBindingsでAuthにユーザー情報が設定されるのか

どうぞよろしくお願いします。

補足情報(FW/ツールのバージョンなど)

Laravel Sailを利用しており、Laravelのバージョンはv9.36.4です。

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

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

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

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

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

guest

回答1

0

試したけど結果が変わるのはStartSessionの前か後かの場合。

一番確実なのはリクエスト処理の後に実行。これならどこに書いても同じ。

php

1 public function handle(Request $request, Closure $next) 2 { 3 $response = $next($request); 4 5 Log::info('userId:' . Auth::id()); 6 7 return $response; 8 }

投稿2022/11/11 04:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

irithyll

2022/11/11 05:44

ご協力ありがとうございます。 私も最初StartSessionが怪しいと思い、その前後でAccessLoggerの挙動を確認したのですが、どちらもユーザーIDが取得できませんでした。 私の環境とは違う結果ですね。 となると、$middlewarePriorityを設定しない場合、ミドルウェアの実行順は不定ということになるでしょうか。 すみません、ユーザーIDはコントローラーの処理の前に出力したいのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問