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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

2回答

1604閲覧

サービスプロバイダの中でauth()にguardを自動判別させたい

mihit

総合スコア61

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2019/04/09 12:11

編集2019/04/09 12:14

ゴール

サービスプロバイダの中でも、認証情報を提供するGuardの種類を、アクセスの出元(web、api etc)によって自動判別させたい

状況

サービスプロバイダで自作サービスを登録し、register()メソッドでサービスに
auth()->user()を紐づけています。

これをPassportで認証をしたAPI経由で
利用しようとしていますが、

この条件でresolveすると
auth()->user()
がNullになります。

サービスプロバイダの外(Controllerなど)でauth()->user()をすると認証情報が取れます。

また、サービスプロバイダの中でも
auth()->guard('api')->user()
これならユーザーが取れます。
※api という名前にpassport認証ドライバを紐づける設定を書いています。

この現象から、デフォルトの認証方式であるsessionGuardを見に行ってるのは想像つくのですが… さすがにこれを毎回書くのは不便です。
どうすればサービスプロバイダの中でも、外と同じように経路を考慮した認証情報を取得してくれるようになるでしょうか。

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

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

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

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

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

guest

回答2

0

この処理をやりたい場合は
サービスプロバイダで実装するのではなく
ミドルウェアで実装するべきかと思います。
必要があれば、ミドルウェアをサービスプロバイダ経由で登録する形になると思います(パッケージ化するなどの場合)

投稿2019/04/10 06:28

mikkame

総合スコア5036

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

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

mihit

2019/04/10 15:20

ありがとうございます、やってみます! なお後学のため、middlewareを使うとなぜ問題が解決するのかお聞かせいただけると幸いです!
mikkame

2019/04/10 15:41 編集

サービスプロバイダのregisterですが、名前の通り 各サービスを登録するためのみに使うべきです。この時点では、他のサービスは初期化、準備が完了しているかどうかは不明と考え、他のサービスに依存した挙動をするべきではありません。 middlewareは全てのサービスが登録され終わってから実行されます。 本記事で出ている用語だと サービスプロバイダregister → middleware → controller → middleware という順番で実行されるためです。 全てのルートで必ず実行される処理を書きたいという事であれば、middlewareに書くのが妥当かと思われます。 あとついでにですが、サービスプロバイダのregisterはCLIから呼び出した場合でも実行されるので やはり、HTTPアクセスされている時が前提のコードを書くのはよろしくないと思います。 (独自にコマンドを追加した場合とかにこけそうです)
mihit

2019/04/12 15:53

実行順の詳しいご教示ありがとうございます! CLI実行時についての示唆も大変参考になります! 恥ずかしながらまだ試せていませんが、実装としてはmiddlewareをサービスプロバイダのように扱うイメージでしょうか。 class registerService { function handle( $request, Closure $next ) { app()->bind( MyService::class, function() { return new MyService( auth()->user() ); } return $next( $request ); } }
mikkame

2019/04/13 03:19

middleware は HTTPリクエストに対して、フィルターのような感じで必ず行う処理を書く所となります。 サービスの内容がわからないとなんとも言えないのですが サービスプロバイダとMiddlewareは使い方が根本的に違います。 https://www.ritolab.com/entry/69
guest

0

framework/AuthManager.php at 5.8 · laravel/framework

ミドルウェアで shouldUse を呼ぶのがアーキテクチャ的に正しい方法ですね。但しこれはミドルウェアを自作せずとも Laravel デフォルトの authAuthenticate) ミドルウェアが引数でサポートしています。

ルーティング時に ->middleware('auth:api') などとコロンの後に Guard のエイリアス名を指定するとその Guard を使用してくれます。

【Laravel】 認証や認可に関する補足資料 - Qiita

投稿2019/04/28 07:57

mpyw

総合スコア5223

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

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

mpyw

2019/04/28 07:59

1件1件書くのが億劫であれば Route::middleware('auth:api')->group(function () { ... }) としてルーティングのグループ化を行うなど,いくらでも解決策はあります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問