laravel admin 升级 dact admin

一、移除Laravel admin

移除Laravel admin并且卸载一切Laravel admin的相关插件

composer remove encore/laravel-admin

二、注释代码

注释代码防止跑命令报错,代码位置在app/Admin/routes.php

Admin::registerAuthRoutes();

三、安装Dact admin

1、安装

composer require dcat/laravel-admin:"2.*" -vvv

2、全局替换命名空间

Encore\Admin替换为Dcat\Admin

3、发布资源

删除public/vendor****目录文件,并且备份配置文件config/admin.php命名为config/admin.bak.php,重新发布资源

php artisan admin:publish --force

四、更新路由

位置在app/Admin/routes.php

1、引入
use Dcat\Admin\Admin;
use Illuminate\Support\Facades\Route;
2、更新代码

将已注释的Admin::registerAuthRoutes();替换为Admin::routes();

3、移除代码
'namespace'     => config('admin.route.namespace')
4、更新路由写法

示例

// 将
$router->get('/', 'HomeController@index');
// 替换为:
$router->get('/', [HomeController::class, 'index']);

五、更新创建AuthController

在app/Admin/Controllers先添加文件AuthController.php,内容为

<?php

namespace App\Admin\Controllers;

use Dcat\Admin\Admin;
use Illuminate\Http\Request;
use Dcat\Admin\Http\Controllers\AuthController as BaseAuthController;

class AuthController extends BaseAuthController
{
    /**
     * Send the response after the user was authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
    protected function sendLoginResponse(Request $request)
    {
        $request->session()->regenerate();

        $path = $this->getRedirectPath();

        return $this->response()
            ->success(trans('admin.login_successful'))
            ->location($path)
            ->locationIf(Admin::app()->getEnabledApps(), $path)
            ->send();
    }
}

六、修改bootstrap.php

然后需要打开app/Admin/bootstrap.php,如果其中有GridFormShow等等的初始化操作、以及顶部导航栏设置的功能,都需要做点改动,具体请参考文档。

示例代码:

<?php

use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Admin;
use Dcat\Admin\Grid\Filter;
use Dcat\Admin\Form\Field\Editor;

/**
 * Dcat-admin - admin builder based on Laravel.
 * @author jqh <https://github.com/jqhph>
 *
 * Bootstraper for Admin.
 *
 * Here you can remove builtin form field:
 *
 * extend custom field:
 * Dcat\Admin\Form::extend('php', PHPEditor::class);
 * Dcat\Admin\Grid\Column::extend('php', PHPEditor::class);
 * Dcat\Admin\Grid\Filter::extend('php', PHPEditor::class);
 *
 * Or require js and css assets:
 * Admin::css('/packages/prettydocs/css/styles.css');
 * Admin::js('/packages/prettydocs/js/main.js');
 *
 */
Admin::css('css/admin.css');
Grid::resolving(function (Grid $grid) {
    $grid->disableViewButton();
    $grid->setActionClass(Grid\Displayers\Actions::class);
    $grid->filter(function (Grid\Filter $filter) {
       $filter->panel();
    });
});

Form::resolving(function (Form $form) {
    $form->disableEditingCheck();
    $form->disableCreatingCheck();
    $form->disableViewCheck();
    $form->tools(function (Form\Tools $tools) {
        // $tools->disableDelete();
        $tools->disableView();
        // $tools->disableList();
    });
});

Editor::resolving(function (Editor $editor) {
    $editor->imageDirectory('editor/images');
});

// 扩展:隐藏的“等于”筛选
Filter::extend('hiddenEqual', HiddenEqual::class);

七、登录后台

至此可以登录后台了,后续还需要进行兼容处理,具体根据文档更改即可,例如HomeController中

// 将代码
public function index()
    {
return Admin::content(function (Content $content) {
            $content->header('Dashboard');
            $content->row(function (Row $row) {
// 更新为:
public function index(Content $content)
    {
        return $content
            ->header('主页')
            ->body(function (Row $row) {

八、后台相关修改

以下只是示例,可参照dact admin文档自行修改

1、控制器

关联模型使用调整,需要检查gridformshow是否有使用关联模型,如果有的话需要进行以下改动

// 表格
$grid = new Grid(Model::with([...]));
// 表单
$form = new Form(Model::with([...]));
// 数据详情
$show = new Show($id, Model::with([...]));

这里可能会有疑问,为什么要显式的声明关联关系,像laravel-admin那样自动判断不好吗?其实这样设计也是有原因的,主要是为了解决下面这样的问题

return Form::make(Model::with('...'), function (Form $form) {
// 主要是为了实现在这个闭包中能拿到模型数据的功能
// 而这个功能需要在回调执行之前就把数据查询出来,所以无法做到自动判断关联模型
if ($form->model()->username) {
  ...
} else {
  ...
}});

grid表格的数据导出方法用法有所不同,需要查阅文档

form表单提交已经改成ajax提交,所以表单事件用法有所不同,需要查阅文档

2、模型

如果你使用的是laravel7,需要在你的模型中加上以下代码

use Dcat\Admin\Traits\HasDateTimeFormatter;
class User extend Model{
    use HasDateTimeFormatter;
}
3、自定义view
...<script>
Dcat.ready(function () {
    // 把你的js代码放到这里面
});
</script>
4、使用了action form

如果你使用了laravel-admin的弹窗表单功能,需要做点调整,具体使用可参考文档工具表单

superbad.cn