巧用 Laravel-admin 的 Grid::init () 方法

jxlwqq發表於2019-12-10

在使用 Laravel-admin 的日常開發中,經常需要編寫資源排序及後臺使用者操作許可權等問題,在每個 Controller 裡寫相同的程式碼顯得非常冗餘,有沒有好的辦法把這些程式碼抽離出來呢?

當然有啦!

app/Admin/bootstrap.php 檔案中新增以下程式碼即可:

<?php

use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;

Encore\Admin\Form::forget(['map', 'editor']);

Grid::init(function (Grid $grid) {
    // 排序
    $order_ignore_models = [];
    if (!in_array(get_class($grid->model()->eloquent()), $order_ignore_models)) {
        $grid->model()->orderBy('id', 'desc');
    }

    // 許可權
    $permissions = [
        'index',
        'view',
        'create',
        'edit',
        'delete',
    ];
    $user_permissions = [];
    foreach ($permissions as $permission) {
        // 這裡的許可權名稱要事先約定好,為 `table-name.permission`
        $user_permissions[$permission] = str_replace('_', '-', $grid->model()->getTable()) . '.' . $permission;
    }

    if (Admin::user()->cannot($user_permissions['create'])) {
        $grid->disableCreateButton();
    }
    $grid->actions(function (Grid\Displayers\Actions $actions) use ($user_permissions) {
        if (Admin::user()->cannot($user_permissions['delete'])) {
            $actions->disableDelete();
        }
        if (Admin::user()->cannot($user_permissions['edit'])) {
            $actions->disableEdit();
        }
        if (Admin::user()->cannot($user_permissions['view'])) {
            $actions->disableView();
        }
    });
});
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章