主题
CatchAdmin 开发小技巧
实用的开发技巧和经验分享
这里收集了 CatchAdmin 后台管理系统和 Laravel 框架的实用开发技巧,帮助开发者更好地适应框架开发。这些技巧来源于实际项目经验,能够有效提升开发效率。也 👏 欢迎开发者补充更多实用技巧
取消路由中间件
CatchAdmin 后台路由默认注册了四个核心中间件:
php
Catch\Middleware\AuthMiddleware // 用户认证中间件
Catch\Middleware\JsonResponseMiddleware // JSON 响应中间件
Modules\User\Middlewares\OperatingMiddleware // 操作日志记录中间件
Modules\Permissions\Middlewares\PermissionGate // 权限验证中间件
模块中的路由通常会全局应用这些中间件,但某些场景下(如微信公众号验证、第三方回调接口等)并不需要这些中间件。可以使用以下技巧进行灵活控制:
取消后台所有公共的中间件
使用 withoutMiddleware(config('catch.route.middlewares'))
可以取消所有默认中间件:
php
Route::withoutMiddleware(config('catch.route.middlewares'))
->prefix('wechat')
->group(function(){
Route::prefix('official')->group(function (){
Route::get('sign', [OfficialAccountController::class, 'sign']);
});
//next
});
取消某个中间件
如果只需要取消特定中间件(如权限验证),可以这样操作:
php
Route::withoutMiddleware(\Modules\Permissions\Middlewares\PermissionGate::class)
->prefix('wechat')
->group(function(){
Route::prefix('official')->group(function (){
Route::get('sign', [OfficialAccountController::class, 'sign']);
});
//next
});
响应自定义
CatchAdmin 默认使用统一的响应结构,格式如下:
php
return [
'message' => '',
'data' => '',
'code' => ''
]
某些场景下需要自定义响应结构(如第三方 API 对接),可以使用 ResponseBuilder
实现灵活的响应格式:
php
return ResponseBuilder::code(10000)
->with('hello', 'world')
->with('hi', 'world')
->data($data)
->message('Hello world');
验证属性遇到第一个错误直接返回
Laravel 默认会验证所有规则后再返回错误,这在包含数据库查询的验证规则时会造成性能浪费。例如即使基础验证失败,仍会执行数据库验证:
php
$request->validate([
'code' => [
'required',
'size:6',
function (string $attribute, mixed $value, \Closure $fail) use ($request) {
// 这里是数据验证 code 码,例如手机验证码
}]
]);
为了提升性能,可以使用 bail
规则让验证遇到第一个错误就停止:
php
$request->validate([
'code' => [
'bail', // 添加这个属性即可
'required',
'size:6',
function (string $attribute, mixed $value, \Closure $fail) use ($request) {
// 这里是数据验证 code 码,例如手机验证码
}]
]);
如果使用 FormRequest
进行验证,可以通过设置 stopOnFirstFailure
属性实现全局的"遇错即停":
php
protected $stopOnFirstFailure = true;
INFO
通过将 stopOnFirstFailure 属性添加到请求类,一旦发生单个验证失败,它应该停止验证所有属性
如何单独显示菜单 不用菜单下拉
INFO
如果是二级菜单,并且只有一个
二级菜单的情况下,那么只会显示二级菜单。
找到前端项目的文件 src/layout/components/Menu/index.vue
,找到 filterMenus
方法,找到下面的代码
js
menus?.forEach((m) => {
if (m.meta?.hidden) {
return false
}
newMenus.push(m)
/**
if (isHasOnlyChild(m) && m.children?.length) {
newMenus.push(
Object.assign({
path: m.children[0].path,
meta: m.children[0].meta,
name: m.name
})
)
} else {
newMenus.push(m)
}*/
})
return newMenus
打开注释即可
前端支持 Keepalive
KeepAlive
功能可以保持标签页面状态,切换时不重新加载,提升用户体验:
INFO
配置完之后记得刷新后台才能生效