本文目录
一、分类详情api
1.1 分类详情控制器方法
/**
* 分类详情
*/
public function show(Category $category)
{
return $category;
}
我们这边直接使用路由模型,返回模型。
1.2 测试效果:
可以看到当前分类详情数据已经返回。
不过需要注意的是在获取分类详情的时候,编辑的时候是需要获取到所有分类列表的。但是禁用的我们不显示,所以需要在获取列表的控制权方法中修改,默认获取到列表不包含被禁用的,只要传了all
就是获取所有的包括被禁用的,如下修改:
public function index(Request $request)
{
$type = $request->input('type');
if ($type == 'all') {
return cache_category_all();
}
else {
return cache_category();
}
}
这样我们就可以在文档中写入参数说明,需要全部的传all
,正常取的话那些被禁用的就取不到,符合业务场景。
二、更新分类api
2.1 更新分类控制权方法
/**
* 更新分类详情
*/
public function update(Request $request, Category $category)
{
$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('不能超过三级分类');
$updateData = [
'name' => $request -> input('name'),
'pid' => $pid,
'level' => $level,
];
$category->update($updateData);
// 更新成功需要刷新缓存
forget_cache_category_all();
return $this->response->noContent();
}
2.2 测试效果
2.3 优化
我们可以看到在添加和更新的时候验证存在代码冗余,我们在当前分类控制器中写个函数来判断表单验证及计算:
/**
* 验证提交的参数
*/
protected function checkInput($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('不能超过三级分类');
return [
'name' => $request -> input('name'),
'pid' => $pid,
'level' => $level,
];
}
修改添加和更新方法:
/**
* 添加分类
*/
public function store(Request $request)
{
$insertData = $this->checkInput($request);
if (!is_array($insertData)) return $insertData;
Category::create($insertData);
// 创建成功需要刷新缓存
forget_cache_category_all();
return $this->response->created();
}
/**
* 更新分类详情
*/
public function update(Request $request, Category $category)
{
$updateData = $this->checkInput($request);
if (!is_array($updateData)) return $updateData;
$category->update($updateData);
// 更新成功需要刷新缓存
forget_cache_category_all();
return $this->response->noContent();
}
测试发现效果还是一样,但此时代码已经精简了。可以看到我们使用laravel
非常简便和优雅。
三、禁用和启用分类api
3.1 定义禁用和启用分类路由
//禁用和启用路由
$api->patch('category/{category}/status', [CategoryController::class, 'status']);
3.2 控制器方法
/**
* 状态禁用和启用
*/
public function status(Category $category)
{
$category->status = $category -> status == 1 ? 0 : 1;
$category->save();
// 更新需要刷新缓存
forget_cache_category_all();
return $this->response()->noContent();
}
3.3 测试效果
3.4 优化(观察者)
我们可以看到,每次在数据发生改变的时候,我们都要去清空下缓存,但是我们现在是直接写在方法里的,我们可以将其写在模型事件里,而不用每次去控制器方法调用一下。
但是我们写在模型里的话,模型中代码会臃肿,所以我们使用观察者。
创建观察者命令:
php artisan make:observer CategoryObserver --model=Category
在CategoryObserver.php
观察者中写入事件清空缓存:
然后删除CategoryController.php
控制器中的删除清空缓存的代码:
然后再在app/Providers/AppServiceProvider.php
中将我们的观察者注册进去:
1 测试
可以看到现在分了添加商品是被禁用的。
那我们获取下分类列表:
可以看到里面是没有被禁用掉的添加商品。我们通过禁用和启用接口调用,将添加商品变为启用的状态,再重新获取看看是不是走缓存,还是重新去数据库取了。效果:
可以看到效果还是一样的,不过我们使用了观察者去监听模型是否改变了。
在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。