当前约定总览
这篇文档不是重复介绍每个模块怎么用,而是把 Anon Framework Next 当前真正生效的开发约定 收拢到一处。
如果你只想先知道“现在到底应该怎么写”,先看这篇,再按需展开看其他细分文档。
1. 目录与命名空间
当前推荐统一使用大写目录名,并让目录名与命名空间保持一致:
app/Controllerapp/Serviceapp/Routeapp/Actionapp/Modelapp/Middlewareapp/Provider
对应命名空间也应保持一致,例如:
namespace Anon\Controller;
namespace Anon\Service;
namespace Anon\Route;
namespace Anon\Action;为什么必须这样
Windows 本地文件系统通常对大小写不敏感,所以你把目录写成 app/controller 本地也许还能跑。
但 Linux 线上环境是大小写敏感的:
Anon\Controller\UserController对应的就是app/Controller/UserController.php- 不是
app/controller/UserController.php
所以这不是代码风格问题,而是生产兼容性问题。
2. 响应格式
当前统一响应格式以 REST API 为准。
成功响应
{
"success": true,
"code": 200,
"message": "OK",
"data": {}
}失败响应
{
"success": false,
"code": 400,
"message": "Bad Request",
"error_code": "BAD_REQUEST"
}当前约定
code必须是数字型 HTTP 状态码- 业务错误码放进
error_code - 成功时如果需要业务语义,可额外使用
business_code - 不再使用旧示例里的
"code": "OK"
推荐统一使用:
return Response::success($data, 'OK', 200);return Response::error('缺少参数', 400, null, 'BAD_REQUEST');3. Request 读取方式
请以当前真实实现为准,不要凭印象调用不存在的方法。
当前常用读取方式:
- 查询参数:
$request->input('type', null) - 路由参数:
$request->route('id') - 请求头:
$request->header('Authorization', '') - Cookie:
$request->cookie('access_token') - 文件:
$request->file('file')
不要使用当前运行时并不存在的方法,例如:
$request->query('type');如果某段旧代码或旧文档里还在用 query(),按现在的实现应改成 input()。
4. Env 与 Config
当前推荐分工:
anon.config.php:放结构化配置.env*:放敏感值和环境差异值
读取规则
业务代码中:
- 配置统一走
Config::get() - 环境变量统一走
Env::get()
示例:
use Anon\Core\Facade\Config;
use Anon\Core\Facade\Env;
$sslVerify = (bool) Config::get('http.ssl_verify', true);
$apiKey = trim((string) Env::get('THIRD_PARTY_API_KEY', ''));为什么不推荐直接 getenv()
因为线上环境可能会遇到:
putenv()被禁用- 变量只存在于
$_ENV - 变量只存在于
$_SERVER
框架已经把环境变量读取链做到了 Env::get() 里,直接裸用 getenv() 容易出现“本地正常,线上取不到”的问题。
5. JWT 与认证
当前硬约束:
JWT_SECRET只能来自.env*或部署平台环境变量- 不要把
JWT_SECRET写进anon.config.php
如果要做浏览器登录,优先复用现有 Auth 能力:
Auth::issueTokenPair()Auth::setTokenPairCookies()Auth::forgetTokenPairCookies()Auth::refreshTokens()
如果是第三方登录场景,但对方没有正式登录 API,不要默认承诺可以直接复用对方站点 Cookie。跨域 Cookie 在浏览器上下文本身就有限制。
6. 第三方 API 接入
当前推荐结构:
Controller只读参数和组织响应Service负责第三方请求、签名、错误归一化- 出口统一走
Response::success()/Response::error()
不要把这些逻辑直接塞进控制器:
- 上游 URL 拼接
- 授权头构造
- SSL 选项处理
- 上游错误映射
- 限流头解析
这些都更适合放在 Service。
7. 配置缓存与路由缓存
当前最常见的误判之一就是:代码没问题,但缓存没清。
配置缓存
配置缓存文件:
runtime/cache/config.php如果你修改了:
anon.config.php.env*
但运行结果没变,优先先看配置缓存。
常用命令:
php anon config:clear
php anon config:cache路由缓存
路由缓存文件:
runtime/cache/routes.php如果你修改了:
app/Route/*.php- 控制器类名
- 控制器方法名
但路由还是旧的,优先看路由缓存。
常用命令:
php anon route:clear
php anon route:cache8. framework/core 与运行时 vendor 的关系
当前排查框架问题时一定要分清楚:
- 你改的是
framework/core - 还是项目实际运行的
vendor/yuinijika/anon-core
很多时候:
- 改了
framework/core - 但项目实际执行的是
project/.../vendor/yuinijika/anon-core
那线上效果当然不会变。
所以要先判断 当前生效副本 是哪个,再决定:
- 只改 app
- 改 framework/core
- 同步改 runtime vendor
9. 什么时候该改 app,什么时候该改 core
默认原则:
- 能在
app解决,就先在app解决 - 只有确认是框架通用缺陷,才改
framework/core
更像 app 问题的场景
- 新增业务接口
- 第三方 API 代理
- 登录逻辑
- 业务验证
- 资源格式整理
更像 core 问题的场景
Request/Response基础能力缺失Env在生产环境不兼容- 路由加载或生成器写死了错误目录
- ORM / QueryBuilder 是框架级逻辑错误
- HTTP Client 配置读取时机不对
10. 本地正常,线上异常时先查什么
推荐按这个顺序排:
- 目录大小写
Env::get()/getenv()使用方式- 配置缓存
- 路由缓存
composer dump-autoloadphp-fpm/ opcache 是否还是旧代码- 系统环境变量是否覆盖了
.env*
这是目前最常用、也最省时间的排查顺序。
11. 文档阅读方式
现在建议这样看文档:
- 先看这篇“当前约定总览”
- 再按功能去查专题文档
- 如果遇到旧示例,优先按当前约定修正理解
当前已经重点纠偏过的内容包括:
- 大写目录与 Linux 大小写敏感
- 数字型响应
code Env::get()替代裸getenv()JWT_SECRET只走.env*- 生成器产物目录的大小写
- Provider / Middleware / Resource 示例命名空间
12. 部署交付清单
如果这次改动涉及配置、路由、自动加载或框架底层,交付时建议至少提醒这些:
composer dump-autoloadphp anon config:clearphp anon route:clear- 必要时重新构建缓存
- 重启
php-fpm或刷新 opcache - 确认 Linux 目录大小写与命名空间一致
相关文档
如果你只准备记住一套规则,就记这篇里的内容。
