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

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

王林
王林オリジナル
2023-11-03 08:35:19828ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。