一、分类管理添加分类api
1、分类管理迁移文件
1.1 创建模型同时生成迁移文件
运行命令php artisan make:model Category -m : 
1.2 创建表字段并执行迁移文件
在迁移文件2021_08_10_150705_create_categories_table.php 中创建表字段:
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name')->comment('分类名称');
$table->string('pid')->default(0)->comment('父级,0最高级');
$table->tinyInteger('status')->default(1)->comment('状态:0禁用,1启用');
$table->tinyInteger('level')->default(1)->comment('分类级别');
$table->timestamps();
});
}

运行命令php artisan migrate 执行迁移文件:  就会出现分类表: 
2、分类管理控制器
运行命令php artisan make:controller Admin/CategoryController --api :  继承基础控制器: 
2.1 添加分类控制器方法
CategoryController.php 添加store 方法:
public function store(Request $request)
{
$request->validate([
'name' => 'required|max:16'
], [
'name.required' => '分类名称不能为空'
]);
Category::create($request->only(['name', 'pid']));
return $this->response->created();
}
一个字段的验证,我们这里直接写在了控制器里。 第二个参数可以自定义验证提示。 $this->response->created(); 返回一个添加成功的消息。
2.2 配置模型可允许添加字段
在Models\Category.php 中添加:
protected $fillable = ['name', 'pid'];

2.3 添加效果
 
2.4 level层级问题
我们可以看到有一个问题,那就是id 为5的是id 为1的子类,那么它的level 就应该是2。 所以我们处理下CategoryController.php 控制器逻辑:
public function store(Request $request)
{
$request->validate([
'name' => 'required|max:16'
], [
'name.required' => '分类名称不能为空'
]);
$pid = $request -> input('pid', 0);
$insertData = [
'name' => $request -> input('name'),
'pid' => $pid,
'level' => $pid == 0 ? 1 : (Category::find($pid) -> level + 1)
];
Category::create($insertData);
return $this->response->created();
}
 由于我们添加了level ,所以在Models\Category.php 中还要增加批量赋值的字段: 
2.5 测试层级问题
 可以看到现在就没有问题了。
2.6 限制最大层级3级
还是在CategoryController.php 控制器中处理逻辑:
public function store(Request $request)
{
$request->validate([
'name' => 'required|max:16'
], [
'name.required' => '分类名称不能为空'
]);
$pid = $request -> input('pid', 0);
$level = $pid == 0 ? 1 : (Category::find($pid) -> level + 1);
if ($level > 3) return $this->response->errorBadRequest('不能超过三级分类');
$insertData = [
'name' => $request -> input('name'),
'pid' => $pid,
'level' => $level,
];
Category::create($insertData);
return $this->response->created();
}
效果: 
3、分类资源路由
在routes/admin.php 中创建分类资源路由:
$api->resource('category', CategoryController::class, [
'except' => ['destroy']
]);
 我们将这个删除的路由给排除,因为分类的话,后面会涉及到这个分类是否有东西,如果删除的话比较麻烦,我们直接用启用和禁用来代替就行了。
在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。
|