wellcms-development
スター17
フォーク2
更新日2026年7月21日 10:13
WellCMS 3.0 核心开发、插件编写、服务注册、路由配置与主题定制规范
インストール
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
ファイルエクスプローラー
21 ファイルSKILL.md
readonlyメニュー
WellCMS 3.0 核心开发、插件编写、服务注册、路由配置与主题定制规范
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
| name | wellcms_development |
| description | WellCMS 3.0 核心开发、插件编写、服务注册、路由配置与主题定制规范 |
本手册由 SKILL.md (核心铁律) 与 references/ (专项规范) 共同组成。
Framework_Utils_Reference.md,优先使用 src/Utils/ 和 app/Utils/ 中已实现的工具类(如 DirectoryHelper::rmdirRecursive()、ZipUtility::zip() 等),严禁重复造轮子。render() 或 message(),严禁直接 exit 或 json_encode。插件控制器严禁定义任何 jsonResponse() 包装方法,必须直接调用主程序已提供的 $this->responseFormatter->jsonResponseFormat(array $data);标准 API 响应结构 {success, code, message, data, timestamp} 在调用点显式组装,禁止通过中间层委托。{status, code, message, data, timestamp},其中 status 取值仅为 'success' 或 'error',严禁使用布尔型 success。Routes.php 定义 meta 元数据,控制器通过元数据指令调度。权限控制(requiresUserPerm)必须在路由声明,由 UserPermMiddleware 统一拦截。控制器内严禁调用 groupService->access() 做重复权限判断。CSRF 同理:所有 POST 路由必须声明 'requiresCsrf' => ['enable' => true, 'ttl' => 3600],CsrfMiddleware 在路由层自动校验,控制器内严禁调用 verifyCsrfToken() 做重复验证,模板仅需传参。路由中间件是权限与安全控制的唯一入口。StatefulTrait 管理协程状态。RequestUtils::param() 类型转换铁律:param() 内部已根据 $defval 类型自动强制转换(0→int、0.0→float、''→string、false→bool、null→原始值)。严禁在调用前追加强制类型转换,如 (int)RequestUtils::param('id', 0)、(float)RequestUtils::param('price', 0)。应直接写成 RequestUtils::param('id', 0)、RequestUtils::param('price', 0.0)。DEBUG === 0 时启用静态清单,不再执行 filemtime 检查。overwrite (Rank 竞争) 实现。$layout = $request->getAttributes()['_route_meta']['layout'] ?? '默认模板名';,再传入 $this->render($layout, $data, '插件目录名')。render() 第三个参数传插件目录名字符串(如 'well_forum'),严禁传 true(系统后台模板)或第四个 $id 参数(除非主题继承需要)。后台控制器使用 AdminTrait,前台使用 FrontendTrait。COUNT(*),必须在实体表建立冗余统计并异步/同步更新。$condition 必须严格对齐 install.php 定义的索引顺序。OFFSET,必须统一采用"游标分页 + 锚点保护"。install.php 中使用 raw SQL 更新用户组权限,严禁修改主程序 install/install.sql。涉及 well_group 字段权限更新,必须调用 GroupService 封装类实现。\Framework\Http\Interfaces\ServerRequestInterface $request 参数,并声明 : \Framework\Http\Interfaces\ResponseInterface 返回类型。严禁在 Action 方法中省略 $request 参数或返回类型声明。构造函数 __construct 必须严格对齐 BaseController 签名,新增注入参数排在父类参数之后。Builder::where() 使用 isset($v[0]) 判定 IN 列表,非连续键数组(如 array_diff 返回 [1=>20, 2=>30])会被误判为关联数组,导致 SQL 语法错误。任何经过 array_diff()、array_unique()、array_intersect() 处理的数组,在传入 find() / delete() / update() / read() 等方法的 where 条件作为 IN 列表前,必须先执行 array_values() 重新索引。严禁对关联数组条件(如 ['>=' => 10, '<=' => 20])使用 array_values()。- 或下划线 _,必须使用 PascalCase 驼峰且严格对齐控制器类名与方法名,实现"见路径即知方法"的零成本定位。例如 BatchSyncController::index() → /BatchSync,SettingController::save() → /PostSetting。知名 URL 前缀(admin、api)保留小写,如 /admin/MultiSite/BatchSync、/api/Sync/User/Receive。路由路径 = 控制器缩写 + Action 方法名的 PascalCase 拼接,横杠和下划线破坏这种一一映射关系,导致上下游站点同步时无法通过路径反向索引到具体方法。横杠仅允许出现在域名或物理文件名后缀。// hook xxx 扩展点,不得在自己的 Hooks/ 目录下实现应由其它插件提供的扩展。例如文章评论/审核的消息通知必须由 well_message 实现,而非 well_article 自己实现。views/htm/*.htm)中严禁以任何形式拼接路由路径或 URL,包括路径段拼接(如 $action . '/' . $id)和查询字符串拼接(如 $slug . '?tag=' . urlencode(...))。所有 URL 必须由控制器或服务层通过 $this->urlGenerator->url() 生成,并以完整变量形式传入模板;模板仅允许直接输出已封装好的 URL。重复犯错将导致路由与 url_rewrite_on 模式不同步、URL 重写失效及安全转义缺口。htmlspecialchars()、htmlentities() 等底层转义函数。所有需要安全输出的数据必须通过视图对象方法:<?php echo $view->e('key.subkey');?>(自动 htmlspecialchars,默认 ENT_QUOTES)或 <?php $data = $view->raw('key.subkey', $default);?>(原始值,仅用于遍历/逻辑判断)。若数据在模板中被抽取为本地变量,说明控制器传参方式错误;本地变量只允许存放无需转义的预封装值(如 URL、数字 ID)。views/htm/*.htm)中严禁编写自定义 JavaScript,包括内联 <script> 块、内联事件处理器(onclick、onchange、onsubmit 等)、自行封装 fetch/XMLHttpRequest、引入外部 JS 库。所有交互必须使用主程序 app/views/js/main.js 提供的声明式属性(ajax-get、ajax-post、data-confirm、data-arg 等)或 wellcms.* JS API(wellcms.get、wellcms.post、wellcms.confirm、wellcms.dialog、wellcms.toast 等)。src/Utils/, app/Utils/)。编写插件前先查此文档,避免重复造轮子。find() $key 语义、缓存锁、排列顺序(ORDER BY)、大数据分区(Partition)。Last Updated: 2026-06-28 - 新增铁律 #27:模板输出统一转义,严禁直接调用 htmlspecialchars();新增铁律 #28:模板严禁自定义 JS,必须使用主程序 wellcms 声明式交互或 JS API。铁律 #26:模板严禁拼接路由。铁律 #8 强化:所有 POST 路由必须声明 requiresCsrf,CSRF 校验由中间件统一拦截,控制器零代码。铁律 #24:路由路径 PascalCase + admin/api 小写前缀。