Laravel Admin 是一个Laravel生态圈的工具,可以快速生成增删改查的后台。还可以自定义表单。

安装

1. 初始化

进入项目目录。安装好Laravel,设置好数据库连接后。运行以下命令。

composer require encore/laravel-admin:1.*
php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
php artisan admin:install

2. 新建数据表posts模型

新建一个表,比如说posts。然后使用命令php artisan make:model Post新建Laravel数据库表模型文件App\Models\Post.php

3. 新建posts表对应的后台管理控制器

// Mac os、 Linux
php artisan admin:make PostController--model=App\\Models\\Post

// Windows
php artisan admin:make PostController--model=App\Models\Post

以上命令会创建App\Admin\Controllers\PostController.php

4. 添加posts的路由

App\Admin\routes.php的group里面添加路由$router->resource('posts', PostController::class);

至此就可以直接访问http://localhost:8080/Admin/posts,会看到列表页。

5. 一些说明

App\Admin\Controllers\PostController.php里面有三个方法。

  • grid:列表页
  • detail:详情编辑页
  • form:详情查看页

更多选项可以查看官方文档:https://laravel-admin.org/docs/zh/1.x/model-grid

自定义表单

创建表单文件

也就是官方文档中的数据表单。用来创建表单, 可以自定义页面页处理方法。
php artisan admin:form Upload 会创建一个表单文件App\Admin\Forms\Upload.php

namespace App\Admin\Forms;

use Encore\Admin\Widgets\Form;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use App\Models\Post;
// 这里可以引入任意模型、类文件。
class Upload extends Form
{
    /**
     * The form title.
     *
     * @var string
     */
    public $title = '这里写标题';

    /**
     * Handle the form request.
     *
     * @param Request $request
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request)
    {
        
        // 这里任意写表单提交后的处理逻辑

        admin_success('Processed successfully.');

        return back();
    }

    /**
     * Build a form here.
     */
    public function form()
    {

        // 这里写生成表单html各种方法。模型表单中的组件都可以在这里使用。
        // https://laravel-admin.org/docs/zh/1.x/model-form-fields
        // 比如:
        $this->number('id','Post ID')->rules('required');
        $this->radio('upload_method','上传方式')
        ->options([
            'upload_file'=>'上传文件',
            'remote_download'=>'远程下载',
            'import_url'=>'导入链接'
        ])->when('upload_file',function(Form $form){
            $form->multipleImage('imgs','上传图片')->removable();
        })->when('remote_download',function(Form $form){
            $form->textarea('remote_download_url','输入要下载的链接')->rows(10);
        })->when('import_url',function(Form $form){
            $form->textarea('import_url','输入要导入的链接')->rows(10);
        })->rules('required');
    }

    /**
     * The data of the form.
     *
     * @return array $data
     */
    public function data()
    {

        // 这里写表单的默认值
        return [
            'id'       => '123',
            'upload_method'      => 'upload_file',
        ];
    }
}

在控制器中使用表单

在任意控制器中使用以下代码输出表单

use App\Admin\Forms\Upload;
use App\Http\Controllers\Controller;
use Encore\Admin\Layout\Content;

class UserController extends Controller
{
    public function Upload(Content $content)
    {
        return $content
            ->title('网站设置')
            ->body(new Upload());
    }
}

表单的各种选项、初始化数值、提交后的处理逻辑都在form文件中定义,而不是在控制器中。

其他问题

模型表格中,时间戳显示问题

文档中貌似写了可以用date来格式化输出

如果字段值为时间戳,可以用date方法格式化输出
$grid->column('created_at')->date('Y-m-d');
其中格式参数请参考PHP的date函数

但实际上这个功能是用于行内编辑的组件,而不是修改输出格式。作者在其Github的Issue中提到可以用回调函数,也可以使用Trait修改模型的默认时间戳输出格式。

  • 回调函数

    $grid->column('updated_at')->display(function ($updated_at) {
      return date('Y-m-d',strtotime($updated_at));
    });
  • 在模型中使用Trait(最好用这个)

    // App\Models\Post.php
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use Encore\Admin\Traits\DefaultDatetimeFormat;
    
    class Post extends Model
    {
      use DefaultDatetimeFormat;
    }
文章目录