这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战
一、分类管理添加分类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
方法:
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
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
控制器逻辑:
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
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)// 计算level
];
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
$pid = $request -> input('pid', 0);
// 计算level
$level = $pid == 0 ? 1 : (Category::find($pid) -> level + 1); // 计算level
// 分类不超过3级
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的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。