Skip to content

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

配置完之后记得刷新后台才能生效