Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What is going on with this article?
@ucan-lab

Laravel 認証済みユーザーの取得方法

公式ドキュメント

環境

  • PHP: 8.0.2
  • Laravel: 8.28.1

認証済みユーザー取得

Laravelで認証済みユーザーを取得する方法がいくつかあるのでご紹介します。

Authファサード

use Illuminate\Support\Facades\Auth;

// 現在認証しているユーザーを取得
$user = Auth::user();

// 現在認証しているユーザーのIDを取得
$id = Auth::id();

authヘルパー

// 現在認証しているユーザーを取得
$user = auth()->user();

// 現在認証しているユーザーのIDを取得
$id = auth()->id();

Requestインスタンス(メソッドインジェクション)

app/Http/Controllers/FlightController.php
<?php declare(strict_types=1);

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;

final class FlightController extends Controller
{
    /**
     * @param Request $request
     * @return Response
     */
    public function update(Request $request): Response
    {
        $user = $request->user()

        // ...
    }
}

Requestインスタンス(コンストラクタインジェクション)

前述まで紹介したものの中ではこのコンストラクタインジェクションのパターンが好きです。

app/Http/Controllers/FlightController.php
<?php declare(strict_types=1);

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;

final class FlightController extends Controller
{
    public function __construct(private Request $request)
    {
    }

    /**
     * @return Response
     */
    public function update(): Response
    {
        $user = $this->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
<?php declare(strict_types=1);

namespace App\Repository;

use App\Models\User;

interface AuthenticatedUser
{
    public function user(): User;

    public function id(): int;
}

app/Repository/LaravelAuthenticatedUser.php [新規]

AuthenticatedUser インターフェースを実装した LaravelAuthenticatedUser クラスを作成します。

app/Repository/LaravelAuthenticatedUser.php
<?php declare(strict_types=1);

namespace App\Repository;

use App\Models\User;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Http\Request;

final class LaravelAuthenticatedUser implements AuthenticatedUser
{
    public function __construct(private Request $request)
    {
    }

    /**
     * @return User
     * @throws AuthorizationException
     */
    public function user(): User
    {
        $user = $this->request->user();

        if ($user === null) {
            throw new AuthorizationException('ここから先は通さん!!!');
        }

        return $user;
    }

    /**
     * @return int
     * @throws AuthorizationException
     */
    public function id(): int
    {
        $id = $this->request->user()?->id;

        if ($id === null) {
            throw new AuthorizationException('ここから先は通さん!!!');
        }

        return $id;
    }
}

app/Providers/AppServiceProvider.php [編集]

AuthenticatedUser インターフェースに対応する LaravelAuthenticatedUser 実装するクラスのバインド設定をサービスプロバイダーで行います。

app/Providers/AppServiceProvider.php
<?php declare(strict_types=1);

namespace App\Providers;

use App\Repository\AuthenticatedUser;
use App\Repository\LaravelAuthenticatedUser;
use Illuminate\Support\ServiceProvider;

final class AppServiceProvider extends ServiceProvider
{
    public array $bindings = [
        AuthenticatedUser::class => LaravelAuthenticatedUser::class,
    ];
}

app/Http/Controllers/FlightController.php [編集]

AuthenticatedUser インターフェースをコントローラ側で使ってみます。

app/Http/Controllers/FlightController.php
<?php declare(strict_types=1);

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;

final class FlightController extends Controller
{
    public function __construct(private AuthenticatedUser $authenticatedUser)
    {
    }

    /**
     * @return Response
     */
    public function update(): Response
    {
        dump($this->authenticatedUser->user());
        dump($this->authenticatedUser->id());

        // ...
    }
}

こんな感じでLaravelフレームワーク(ファサードやヘルパー)ではなくAuthenticatedUserインターフェース(抽象)に依存したコードが書けました🙌

10
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ucan-lab
Backend Developer at ROLO. I love PHP and I'm focusing on Laravel, Docker, GraphQL.
yyphp
PHPerが毎週集まり、ざっくばらんに情報交換する雑談コミュニティ

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
10
Help us understand the problem. What is going on with this article?