laravel-admin商户权限的封装
情景
laravel-admin本身有一套权限系统,因为我们的系统要区分总管理后台和商户管理后台。总管理后台可以看到所有商户的信息。所以做2套系统有点麻烦。于是又加了一层权限。 加了这层权限后会遇到这些问题。
- 编辑页总管理后台可以选择商户,商户管理后台没有这个选项。
 - 列表页总管理后台可以看到商户名称,商户管理后台没有这个列表。
 - 商户管理后台不能看到属于其他商户的信息。
 - 商户管理后台只能修改属于自己的信息。
 - 总部后台可以编辑查看所有商户的信息。
 
经过抽茧剥丝之后,我写出了以下封装。
<?php
/**
 * Created by PhpStorm.
 * User: 清行
 * Date: 2019/12/24
 * Time: 13:40
 */
namespace App\Traits;
use App\Models\Merchant;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Show;
use Illuminate\Support\MessageBag;
trait LaravelAdmin
{
    public $isMerchant = false;
    public $merchantId = '';
    public $adminId = '';
    static $ddd = 0;
    public function __construct()
    {
//        if (empty(self::$ddd))
//        {
//            self::$ddd++;
//        }else{
//            self::$ddd+=2;
//        }
////        session()->put('q','d');
////        dd(session()->all());
////        if (empty(session()->get('adminId')))
////        {
////            $this->singleObject();
////        }
    }
    public function singleObject()
    {
//        $this->init();
        session([
            'isMerchant'=> $this->isMerchant,
            'merchantId'=> $this->merchantId,
            'adminId'=> $this->adminId,
        ]);
    }
    /*********************************************************
     * 初始化 Start
     */
    //初始化数据
    public function init()
    {
        $this->isMerchant();
        $this->getMerchantId();
        $this->getAdminId();
    }
    //自动初始化数据
    public function autoInit()
    {
        if (empty($this->adminId))
        {
            $this->init();
        }
    }
    //判断是否是商家
    public function isMerchant()
    {
        $this->isMerchant = \Admin::user()->isRole('merchant');
        return $this->isMerchant;
    }
    //获取商户ID
    public function getMerchantId()
    {
        $this->merchantId = \Admin::user()->merchant_id;
        return $this->merchantId;
    }
    //获取管理员ID
    public function getAdminId()
    {
        $this->adminId = \Admin::user()->id;
        return $this->adminId;
    }
    /**
     * 初始化 END
     *********************************************************/
    /*********************************************************
     * 功能 Start
     */
    //页面跳转
    public function header($url)
    {
        return header('Location: '.config('admin_url').$url);
    }
    //获取form编辑页的id
    public function getFormId()
    {
        return current(request()->route()->parameters());
    }
    /**
     * 功能 END
     *********************************************************/
    /*********************************************************
     * 筛选 Start
     */
    /**
     * 初始化 并 根据merchant_id筛选
     * @param $grid
     * @param bool $isDisableDelete
     */
    public function defaultFilter($grid,$isDisableDelete=false)
    {
        $this->init();
        $this->filterMerchantId($grid,$isDisableDelete);
    }
    /**
     * 根据商户merchant_id筛选出显示的内容
     *
     * @param $grid
     * @param bool $isDisableDelete
     */
    public function filterMerchantId($grid,$isDisableDelete=false)
    {
        if ($this->isMerchant)
        {
            if ($isDisableDelete)
            {
                $grid->actions(function ($actions) {
                    $actions->disableDelete();
                });
            }
            $grid->model()->where('merchant_id',$this->merchantId);
        }
    }
    /**
     * 筛选 END
     *********************************************************/
    /**
     * 显示商户的名称
     *
     * @param $grid
     * @param $name  列名称
     */
    public function showMerchantName($model,$name='所属商户',$isHaveStore=false)
    {
        $this->autoInit();
        if ($model instanceof Grid) {
            if (!$this->isMerchant){
                $model->column('merchant_id', __($name))->display(function ($id){
                    return Merchant::getName($id);
                });
            }
        }
        if ($model instanceof Show){
            if (!$this->isMerchant){
                $model->field('merchant_id', __($name))->as(function ($id){
                    return Merchant::getName($id);
                });
            }
        }
        if ($model instanceof Form){
            if (!$this->isMerchant){
                if ($isHaveStore)
                {
                    $model->select('merchant_id', __($name))->options(Merchant::getAllKV())->required()->load('store_id', '/admin/ajax/storeListByMerchantId');
                    $model->select('store_id', __('所属门店'))->options('/admin/ajax/storeListByMerchantId')->required();
                }else{
                    $model->select('merchant_id', __($name))->options(Merchant::getAllKV())->required();
                }
            }else{
                if ($isHaveStore) {
                    $model->select('store_id', __('所属门店'))->options('/admin/ajax/storeListByMerchantId?q='.$this->merchantId)->required();
                }
                //保存前回调
                $model->saving(function (Form $form) {
                    if ($this->isMerchant)
                    {
                        $form->model()->merchant_id = $this->merchantId;
                    }
                });
            }
        }
    }
    public function __get($name)
    {
        // TODO: Implement __get() method.
        dd($name);
        $this->init();
    }
    /*********************************************************
     * 检测 Start
     */
    /***
     * 检查是否属于本商户自己的信息 不属于就报错
     */
    public function checkIsMy($model)
    {
        $this->autoInit();
        if ($model instanceof Show)
        {
            if ($this->isMerchant)
            {
                if ( $this->merchantId != $model->getModel()->merchant_id)
                {
                    admin_error('您没有查看此内容的权限', '请检查请求是否正确');
                    return false;
                }
            }
        }
        if ($model instanceof Form)
        {
            if ($this->isMerchant)
            {
                $model->editing(function ($form) use ($model) {
                    if ( $this->merchantId != $form->model()->merchant_id)
                    {
                        admin_error('您没有此内容的编辑权限', '请检查请求是否正确');
                        $this->header('/admin/');
                        return false;
//                        return $this->header('/admin/');
                    }else{
                        return $model;
                    }
                });
                $model->deleting(function ($form) use ($model) {
                    if ( $this->merchantId != $form->model()->merchant_id)
                    {
//                        return $this->header('/admin/ajax/notDelete');
                        $error = new MessageBag([
                            'title'   => '您没有权限',
                            'message' => '您没有此内容的编辑权限',
                        ]);
                        return back()->with(compact('error'));
                    }else{
                        return $model;
                    }
                });
            }
        }
        return $model;
    }
    /**
     * 检测 END
     *********************************************************/
}
介绍一下
1. 列表页显示应该看到的内容 defaultFilter()
加了这个总部看所有,商户只能看到属于自己的信息
$this->defaultFilter($grid);
2. 检测权限checkIsMy()函数
detail里这样用
return $this->checkIsMy($show);
form里这样用
return $this->checkIsMy($form);
3. 所属商户 showMerchantName()函数
第二个参数是自定义显示的名称, 第三个参数是是否显示门店列表。
grid 列表页这么用
$this->showMerchantName($grid,'归属商户');
detail里这样用
$this->showMerchantName($show,'归属商户');
form里这样用
$this->showMerchantName($form,'归属商户');
我们商户下面还有门店,如果要显示门店列表就这么用
$this->showMerchantName($form,'归属商户',true);
怎么样,我封装的还不错吧???反正我用起来还挺方便,代码又简洁。
其实,Laravel-admin的列表、 详情、编辑、有些函数的函数名弄成一样的多好啊,我记性不好,还要查文档。