lordjoo / crudi
带有管理面板的 Laravel CRUD 系统
Requires
- yajra/laravel-datatables: ^1.5
This package is auto-updated.
Last update: 2024-09-24 20:11:05 UTC
README
一个实现了现成管理面板的 CRUD 系统的 laravel 包
特性
- Material Design 管理面板已准备好
- 完整的 CRUD 系统
- 支持 Datatables
要求
- laravel >= 8
- php >= 7.3
使用方法
安装
- 使用 composer 安装它,运行
composer require lordjoo/crudi
- 然后你需要发布资产文件和配置文件,运行
php artisan vendor:publish
- 然后你需要运行
php artisan migrate
来创建图片表(这个表用于存储与任何其他模型一对一关联的各种图像)
它是如何工作的?
这个库依赖于 两个 主要的东西
- CrudiControllerTrait
我们创建了一个具有所有 CRUD 逻辑的 trait,并将其提供给任何控制器使用
- CrudiModal
为了使 CRUD 操作更加流畅,我们创建了一个自定义的抽象类 CrudiModel,该类扩展了 Laravel 模型基类
开始使用
假设我们有一个博客,我们需要使用 Crudi 来处理帖子的 CRUD 操作。
- 首先,我们将创建帖子模型、控制器和迁移
php artisan make:model Post -mc
- 之后,我们将进入
PostController.php
并使用 CrudiControllerTrait,控制器应该看起来像这样
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Lordjoo\Crudi\Traits\CrudiControllerTrait; class PostController extends Controller { use CrudiControllerTrait; }
- 然后我们必须编辑位于 Models 目录中的
Post.php
的帖子模型,并使其看起来像这样
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Lordjoo\Crudi\Models\CrudiModel; class Post extends CrudiModel { use HasFactory; }
- 之后,你必须打开 routes 目录中的 web.php 文件,为它添加路由。Crudi 提供了一个名为 crudi 的路由宏,将为您定义所有路由的名称、前缀和动作
所以打开 web.php 并添加这一行
Route::crudi('posts', 'posts.',\App\Http\Controllers\PostController::class);
第一个参数是路由前缀,第二个是路由名称前缀,最后一个是目标控制器,Crudi 将为您生成以下路由
- 现在,我们必须在 PostController 中定义一些必需的属性
private $model = App\Models\Post::class
这将持有与此控制器关联的模型private $route = "posts"
这将持有我们刚刚添加为第二个参数的路线名称
现在我们几乎完成了,你可以访问 https://:8001/posts/create
,你将得到添加帖子页面,但是页面将是空的。你需要定义帖子字段,我们将通过进入 PostModel 并添加一个 受保护的 属性 fields 来完成这个任务,该属性将是一个二维数组,具有以下形状
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Lordjoo\Crudi\Models\CrudiModel; class Post extends CrudiModel { use HasFactory; /* * System use this object to create the form for creating and updating the model * Types available : * - text * - file * - textarea * - relation_select */ protected $fields = [ [ 'type'=>"text", 'name'=>"Title", 'col'=>'name', ], [ 'type'=>"textarea", 'name'=>"Body", 'col'=>'body' ], [ 'type'=>"image", "accept"=>"img", 'name'=>"Post Thumbnail", 'col'=>'img_id' ], [ 'type'=>'relation_select', "name"=>"Category", 'col'=>"category_id", "relation" => "category" ], ]; }
唯一需要解释的是字段类型中的 relation_select
如你所见,我们定义了一个名为 Category 的字段,它引用了 category 的 id 列,并且这个字段是一个 relation_select,这意味着你将找到一个下拉框,其中包含 categories_table(关系)中的所有项,以选择要附加到帖子上的 category_id
这里还有另一件事,即 帖子图片 字段。Crudi 有一个内置的图片上传功能,因此如果你的任何列应该是图片,只需将其类型设置为 image,crudi 就会负责验证和上传图片。注意,所有图片都存储在 images 表
中,并通过 img_id 相关联,如所示
- 现在如果您保存并返回到 posts/create 页面,您将找到用于提供数据的输入框
在创建页面点击保存后,您将被重定向回 posts/ 页面,页面中有一个空的表格,只有一个列,该列是项目 ID,但是如何显示每个帖子的所有其他值呢?
我们通过定义另一个名为 $4datatable 的 受保护 属性来简单实现这一点
注意:CRUDI 使用 LARAVEL DATATABLES 来生成 {modae}/page
数据表格控制
CRUDI 使用数据表格在仪表板上列出并显示数据,CRUDI 在模型类中使用一个名为 $dataTable
的 受保护 属性来确定要列出什么以及如何列出
在我们的示例中,我们将编写 $datatable 属性以列出帖子标题、缩略图和类别
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Lordjoo\Crudi\Models\CrudiModel; class Post extends CrudiModel { use HasFactory; protected $dataTable = [ [ 'data'=>'id',"title"=>"ID" ], [ 'data'=>"name",'title'=>"Post Title","width"=>200 ], [ 'data'=>"thumbnail_url",'title'=>"Post Photo","render"=>'`<img src="${data}" />`' ], [ 'data'=>'id','title'=>"Category",'name'=>'category','custom'=>true,"width"=>200 ] ]; protected $datatables_custom = [ [ 'col'=>"Category", "relation"=>"category", "relation_col"=>'name' ] ]; protected $with = ['category']; public function category(){ return $this->belongsTo(Category::class); } }