0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelで実現する直感的ルートパーミッション – Enumでコードをシンプルに

Posted at

⚠️: 海外の記事をchatGPTで要約しただけのもの、主に自分用


はじめに

Laravel は、ルート内でのパーミッションチェックを簡素化するため、can() メソッドに直接 enum を利用できる機能を追加しました。これにより、enum の value プロパティに明示的にアクセスする必要がなくなり、より簡潔で表現力のあるルート定義が可能になりました。

この機能は、特に管理者パネルやマルチテナントアプリケーションのような、パーミッション管理が重要なシステムで、PHP の型安全性を活かす際に非常に有用です。

例えば、以下のように記述できます:

Route::get('/admin', function () {
    // ...
})->can(Permission::ACCESS_ADMIN);

Enum対応のルートパーミッションとは?

従来は、enum を利用したパーミッションチェックを行う際、enum の value プロパティにアクセスする必要がありました。しかし、新たな機能では、以下のようによりシンプルに記述できるようになりました。

従来の記述方法:

->can(AdminAccess::MANAGE_STAFF->value)

新しい記述方法:

->can(AdminAccess::MANAGE_STAFF)

この変更により、コードが直感的になり、保守性も向上します。


管理者パネルでの実装例

以下は、管理者パネルでロールベースのルーティングを実装する例です。

1. Enum 定義

まず、app/Enums/AdminAccess.php にて、管理者が持つ権限を enum として定義します。

<?php

namespace App\Enums;

enum AdminAccess: string
{
    case VIEW_REPORTS = 'view_reports';
    case MANAGE_STAFF = 'manage_staff';
    case EDIT_CONFIG = 'edit_config';
}

2. ルート定義

次に、web.php でルートグループを作成し、各ルートに対して対応するパーミッションを設定します。

Route::prefix('admin')->group(function () {
    Route::get('/reports', ReportController::class)
        ->can(AdminAccess::VIEW_REPORTS);

    Route::get('/staff', StaffController::class)
        ->can(AdminAccess::MANAGE_STAFF);

    Route::post('/config', ConfigController::class)
        ->can(AdminAccess::EDIT_CONFIG);
});

このように定義することで、ルートがより直感的になり、各機能へのアクセス権を明確に管理できます。


まとめ

新たに追加された can() メソッドの enum サポートにより、Laravel のルートパーミッションがよりエレガントに、そして型安全性を維持しながら実装できるようになりました。管理者パネルやマルチテナント環境など、パーミッション管理が重要なシステムにおいて、今回の改良は非常に有益です。


元記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?