Skip to content

小技巧

这里将会更新一些Catchadmin后台管理系统中的一些小技巧和 Laravel 框架中的小 tips,以便开发者更好适应这个框架的开发。也 👏 欢迎开发者补充

加速 composer 加载(优化建议)

WARNING

不要在开发环境使用,只适用于生产环境

shell
composer dump-autoload -o --no-dev --classmap-authoritative
  • dump-autoload -o 转换 PSR-0/4 autoloading 到 classmap 获得更快的载入速度
  • --no-dev 禁用 autoload-dev 规则
  • --classmap.authoritative 只加载 ClassMap 中的文件,不必到磁盘文件系统进行任何检查

取消路由中间件

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
});

响应自定义

目前 CatchAdmin 中的响应结构都是固定的, 格式如下

php
return [
    'message' => '',
    'data' => '',
    'code' => ''
]

某些情况下你需要特定的结构的话,并不需要上面固定的结构,那么你可以使用下面的技巧.

php
Route::withoutMiddleware('Catch\Middleware\JsonResponseMiddleware')
    ->group(function(){
    Route::prefix('test')->group(function (){
       Route::get('test', [TestController::class, 'index']);
    });
});

这是由于 CatchAdmin通过中间件将所有响应都转换成了JsonResponse,然后通过劫持 JsonResponse 对象,返回固定的响应格式。 所以只要取消 JsonResponseMiddleware, 然后再自己自定义针对特定接口做相应的数据结构即可

验证属性遇到第一个错误直接返回

如果不做任何控制的话,Laravel 的验证会将每个属性的规则全部验证一遍,然后返回属性的第一个错误,这样非常浪费,例如属性如果需要数据库验证的话,那么即使前面的规则不符合了,还会使用到数据库验证,例如下面的例子

php
$request->validate([
            'code' => [
                'required',
                'size:6',
                function (string $attribute, mixed $value, \Closure $fail) use ($request) {
                   // 这里是数据验证 code 码,例如手机验证码
            }]
        ]);

按照目前的 rule,即使前台发送的 code 不符合 size:6 这个要求,它还是会使用从数据库验证,非常浪费。所以需要遇到第一个 error 就返回,可以这么使用

php
$request->validate([
            'code' => [
                'bail', // 添加这个属性即可
                'required',
                'size:6',
                function (string $attribute, mixed $value, \Closure $fail) use ($request) {
                   // 这里是数据验证 code 码,例如手机验证码
            }]
        ]);

如果是直接通过 $request->validate() 进行请求数据的验证,那么每个属性都需要加 bail 规则,如果你使用的是 FormRequest 进行验证。那么可以使用下面的技巧。添加 stopOnFirstFailure 属性

php
protected $stopOnFirstFailure = true;

INFO

通过将 stopOnFirstFailure 属性添加到请求类,一旦发生单个验证失败,它应该停止验证所有属性