公式ドキュメント
環境
- PHP: 8.0.2
- Laravel: 8.28.1
認証済みユーザー取得
Laravelで認証済みユーザーを取得する方法がいくつかあるのでご紹介します。
Authファサード
useIlluminate\Support\Facades\Auth;// 現在認証しているユーザーを取得$user=Auth::user();// 現在認証しているユーザーのIDを取得$id=Auth::id();
authファサード
// 現在認証しているユーザーを取得$user=auth()->user();// 現在認証しているユーザーのIDを取得$id=auth()->id();
Requestインスタンス(メソッドインジェクション)
app/Http/Controllers/FlightController.php
<?phpdeclare(strict_types=1);namespaceApp\Http\Controllers;useIlluminate\Http\Request;useIlluminate\Http\Response;finalclassFlightControllerextendsController{/**
* @param Request $request
* @return Response
*/publicfunctionupdate(Request$request):Response{$user=$request->user()// ...}}
Requestインスタンス(コンストラクタインジェクション)
前述まで紹介したものの中ではこのコンストラクタインジェクションのパターンが好きです。
app/Http/Controllers/FlightController.php
<?phpdeclare(strict_types=1);namespaceApp\Http\Controllers;useIlluminate\Http\Request;useIlluminate\Http\Response;finalclassFlightControllerextendsController{publicfunction__construct(privateRequest$request){}/**
* @return Response
*/publicfunctionupdate():Response{$user=$request->user()// ...}}
リポジトリー層に認証済みユーザー取得する処理を実装する
公式で紹介されている方法はいずれもLaravelフレームワークに依存してしまいます。
フレームワークへの依存を減らすためにリポジトリー層を用意して実装する方法をご紹介します。
- app/Repository/AuthenticatedUser.php [新規]
- app/Repository/LaravelAuthenticatedUser.php [新規]
- app/Providers/AppServiceProvider.php [編集]
- app/Http/Controllers/FlightController.php [編集]
app/Repository/AuthenticatedUser.php [新規]
新しく AuthenticatedUser
インターフェースを定義します。
app/Repository/AuthenticatedUser.php
<?phpdeclare(strict_types=1);namespaceApp\Repository;useApp\Models\User;interfaceAuthenticatedUser{publicfunctionuser():User;publicfunctionid():int;}
app/Repository/LaravelAuthenticatedUser.php [新規]
AuthenticatedUser
インターフェースを実装した LaravelAuthenticatedUser
クラスを作成します。
app/Repository/LaravelAuthenticatedUser.php
<?phpdeclare(strict_types=1);namespaceApp\Repository;useApp\Models\User;useIlluminate\Auth\Access\AuthorizationException;useIlluminate\Http\Request;finalclassLaravelAuthenticatedUserimplementsAuthenticatedUser{publicfunction__construct(privateRequest$request){}/**
* @return User
* @throws AuthorizationException
*/publicfunctionuser():User{$user=$this->request->user();if($user===null){thrownewAuthorizationException('ここから先は通さん!!!');}return$user;}/**
* @return int
* @throws AuthorizationException
*/publicfunctionid():int{$id=$this->request->user()?->id;if($id===null){thrownewAuthorizationException('ここから先は通さん!!!');}return$id;}}
app/Providers/AppServiceProvider.php [編集]
AuthenticatedUser
インターフェースに対応する LaravelAuthenticatedUser
実装するクラスのバインド設定をサービスプロバイダーで行います。
app/Providers/AppServiceProvider.php
<?phpdeclare(strict_types=1);namespaceApp\Providers;useApp\Repository\AuthenticatedUser;useApp\Repository\LaravelAuthenticatedUser;useIlluminate\Support\ServiceProvider;finalclassAppServiceProviderextendsServiceProvider{publicarray$bindings=[AuthenticatedUser::class=>LaravelAuthenticatedUser::class,];}
app/Http/Controllers/FlightController.php [編集]
AuthenticatedUser
インターフェースをコントローラ側で使ってみます。
app/Http/Controllers/FlightController.php
<?phpdeclare(strict_types=1);namespaceApp\Http\Controllers;useIlluminate\Http\Request;useIlluminate\Http\Response;finalclassFlightControllerextendsController{publicfunction__construct(privateAuthenticatedUser$authenticatedUser){}/**
* @return Response
*/publicfunctionupdate():Response{dump($this->authenticatedUser->user());dump($this->authenticatedUser->id());// ...}}
こんな感じでLaravelフレームワーク(ファサードやヘルパー)ではなくAuthenticatedUser
インターフェース(抽象)に依存したコードが書けました🙌