145 lines
5.7 KiB
PHP

<?php
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
use Spatie\Permission\Exceptions\UnauthorizedException;
use Spatie\Permission\Middleware\PermissionMiddleware;
use Spatie\Permission\Middleware\RoleMiddleware;
use Spatie\Permission\Middleware\RoleOrPermissionMiddleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'role' => RoleMiddleware::class,
'permission' => PermissionMiddleware::class,
'role_or_permission' => RoleOrPermissionMiddleware::class,
]);
})
->withExceptions(function (Exceptions $exceptions) {
$exceptions->render(function (ValidationException $exception, Request $request) {
if (! $request->expectsJson()) {
return null;
}
$attributeLabels = [
'name' => '名称',
'display_name' => '显示名称',
'category' => '分类',
'description' => '描述',
'guard_name' => '守卫',
'parent_id' => '所属服务器',
'internal_ip' => '内网IP',
'asset_id' => '资产ID',
'account_id' => '账号ID',
'protocol' => '协议',
'protocols' => '协议',
'is_active' => '启用状态',
'nickname' => '昵称',
'email' => '邮箱',
'phone' => '手机号',
'password' => '密码',
'role_ids' => '角色',
'permission_ids' => '权限',
'users' => '用户',
'from' => '开始日期',
'to' => '结束日期',
'action' => '动作',
'actions' => '动作',
'user_id' => '用户',
'user_ids' => '用户',
'server_resource_id' => '资源',
'server_resource_ids' => '资源',
'per_page' => '每页数量',
'username' => '用户名',
'token' => '令牌',
];
$resolveAttribute = function (string $field) use ($attributeLabels): string {
if (isset($attributeLabels[$field])) {
return $attributeLabels[$field];
}
foreach ($attributeLabels as $key => $label) {
if (str_starts_with($field, $key.'.')) {
return $label;
}
}
return $field;
};
$ruleMessage = function (string $rule, string $attribute, array $params = []): string {
return match (strtolower($rule)) {
'required' => $attribute.'不能为空',
'present' => $attribute.'必须传入',
'array' => $attribute.'必须是数组',
'string' => $attribute.'必须是字符串',
'integer' => $attribute.'必须是整数',
'boolean' => $attribute.'必须是布尔值',
'email' => $attribute.'格式不正确',
'ip' => $attribute.'格式不正确',
'date' => $attribute.'必须是有效日期',
'exists' => $attribute.'不存在或已失效',
'unique' => $attribute.'已存在,请更换',
'in' => $attribute.'不在允许范围内',
'min' => $attribute.'不能小于'.($params[0] ?? '').'',
'max' => $attribute.'不能大于'.($params[0] ?? '').'',
'regex' => $attribute.'格式不正确',
'nullable' => $attribute.'格式不正确',
'sometimes' => $attribute.'格式不正确',
default => $attribute.'参数不合法',
};
};
$failedRules = $exception->validator->failed();
$translatedErrors = [];
foreach ($failedRules as $field => $rules) {
$attribute = $resolveAttribute($field);
foreach ($rules as $rule => $params) {
$translatedErrors[$field][] = $ruleMessage($rule, $attribute, $params);
}
}
if (empty($translatedErrors)) {
$translatedErrors = $exception->errors();
}
return response()->json([
'code' => 422,
'message' => '请求参数校验失败',
'errors' => $translatedErrors,
'data' => null,
], 422);
});
$exceptions->render(function (UnauthorizedException $exception, Request $request) {
if ($request->expectsJson()) {
return response()->json([
'code' => 403,
'message' => '无权限执行此操作',
'data' => null,
], 403);
}
});
$exceptions->render(function (AuthenticationException $exception, Request $request) {
if ($request->expectsJson()) {
return response()->json([
'code' => 401,
'message' => '未认证或登录已过期',
'data' => null,
], 401);
}
});
})->create();