ホームページ > PHPフレームワーク > Laravel > Laravelでページ要素のパーミッションベースの表示と非表示を実装する方法

Laravelでページ要素のパーミッションベースの表示と非表示を実装する方法

王林
リリース: 2023-11-03 08:35:19
オリジナル
828 人が閲覧しました

Laravelでページ要素のパーミッションベースの表示と非表示を実装する方法

Laravel では、ページ要素のパーミッションベースの表示と非表示を実装することが一般的な要件です。この記事では、Laravelの権限管理ライブラリ「spatie/laravel-permission」を使用して、ページ要素を動的に描画する機能を実装する方法を紹介します。同時に、問題をよりよく説明するために、この記事では簡単なサンプル プログラムを作成します。

1. laravel-permission のインストール

まず、Laravel プロジェクトに「spatie/laravel-permission」コンポーザー パッケージをインストールする必要があります。次のコマンドを使用してインストールします:

composer require spatie/laravel-permission
ログイン後にコピー

インストール後、移行を実行して関連する権限管理テーブルを作成する必要があります:

php artisan vendor:publish --provider="SpatiePermissionPermissionServiceProvider" --tag="migrations"

php artisan migrate
ログイン後にコピー

2. ロールと権限を定義します

今回の例では、「管理者」と「一般ユーザー」の2つのロールを定義し、管理者にすべてのデータを閲覧する権限を与えます。

最初に、config/auth.php ファイルにロールと権限モデルの構成を追加する必要があります:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => AppModelsUser::class,
    ],

    'roles' => [
        'driver' => 'eloquent',
        'model' => SpatiePermissionModelsRole::class,
    ],

    'permissions' => [
        'driver' => 'eloquent',
        'model' => SpatiePermissionModelsPermission::class,
    ],
],
ログイン後にコピー

次に、ユーザー モデルにロールと権限との関係を追加します。 :

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateFoundationAuthUser as Authenticatable;
use SpatiePermissionTraitsHasRoles;

class User extends Authenticatable
{
    use HasFactory, HasRoles;

    //...
}
ログイン後にコピー

その後、Seeder でロールと権限を定義できます:

use IlluminateDatabaseSeeder;
use SpatiePermissionModelsPermission;
use SpatiePermissionModelsRole;

class RolesAndPermissionsSeeder extends Seeder
{
    public function run()
    {
        //创建角色
        Role::create(['name' => 'admin']);
        Role::create(['name' => 'user']);

        //创建权限
        Permission::create(['name' => 'view_all_data']);

        //管理员拥有所有权限
        Role::findByName('admin')->givePermissionTo(Permission::all());
    }
}
ログイン後にコピー

3. 認可と認証

次に、コントローラーの authorize() メソッドを使用して、ユーザーは特定の権限を持っています。たとえば、次のインデックス メソッドには、「view_all_data」権限が必要です。

public function index()
{
    $this->authorize('view_all_data');
    //...
}
ログイン後にコピー

さらに、ビューでは、can() メソッドを使用して、現在のユーザーが特定の権限を持っているかどうかを確認できます。たとえば、次のコードでは、ユーザーが「view_all_data」権限を持っている場合にのみ「すべてのデータを表示」ボタンが表示されます。

@if(auth()->user()->can('view_all_data'))
    <button>查看所有数据</button>
@endif
ログイン後にコピー

より詳細な制御が必要な場合は、ロールを使用できます。 () メソッド。ユーザーが特定のロールを持っているかどうかを判断します。たとえば、次のコードでは、ユーザーが「管理者」ロールを持っている場合にのみ「管理者メニュー」が表示されます:

@if(auth()->user()->hasRole('admin'))
    <menu>管理员菜单</menu>
@endif
ログイン後にコピー

4. ページ要素を動的にレンダリングする

場合によっては、特定の要素は、現在のユーザーのロールまたは権限に基づいて動的にレンダリングされる必要があります。たとえば、管理者のみが [削除] ボタンを表示できるように設定できます:

@if(auth()->user()->can('delete_data'))
    <button>删除</button>
@endif
ログイン後にコピー

ただし、アクセス許可に基づいて動的にレンダリングする必要がある要素が複数ある場合は、各要素を個別に判断する必要があります。コードの重複とメンテナンスが発生し、コストが増加します。現時点では、この関数を Blade コマンドにカプセル化し、権限名をパラメータとして受け入れることができます:

Blade::directive('can', function ($expression) {
    return "<?php if(auth()->user()->can({$expression})): ?>";
});

Blade::directive('endcan', function () {
    return "<?php endif; ?>";
});
ログイン後にコピー

このコマンドを使用すると、次の方法でページ要素を動的にレンダリングできます:

@can('delete_data')
    <button>删除</button>
@endcan
ログイン後にコピー

このようにして、コードはより簡潔かつ明確になります。

まとめ

Laravelのパーミッション管理ライブラリ「spatie/laravel-permission」を利用すると、パーミッションに基づいたページ要素の表示・非表示を簡単に実装できます。同時に、動的にレンダリングされたコードを Blade 命令にカプセル化すると、コードがさらに簡素化され、コードの可読性と保守性が向上します。

以上がLaravelでページ要素のパーミッションベースの表示と非表示を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート