控制器规范

编写控制器时请遵守命名、命名空间、继承与输出约定,以便路由能正确找到类与方法,并与模板、权限、CSRF 等机制兼容。

命名与文件

  • 一个控制器一个 PHP 文件;文件名与类名一致,首字母大写(如 Home.phpclass Home)。

  • URL 参数 c 对应控制器名(不区分大小写解析),m 对应方法名。

  • 可被路由调用的方法必须是 public;构造方法 __construct 负责初始化,不要当作页面动作暴露。

  • 核心放 Fcms/Control/(勿改);业务放应用 Controllers/,按场景分子目录 Admin/Member/Api/

命名空间

位置命名空间
应用前台Phpcmf\Controllers
应用后台Phpcmf\Controllers\Admin
应用会员Phpcmf\Controllers\Member
系统核心Phpcmf\Control / Control\Admin / Control\Api

继承选择

基类适用
\Phpcmf\Common通用控制器;自带站点/会员/管理员上下文与输出方法
\Phpcmf\App应用业务;会检查当前应用是否已安装
\Phpcmf\Table后台表格式 CRUD(列表、添加、修改、回收站等),见应用样例 User
模块扩展基类内容模块场景(如 \Phpcmf\Home\Module),依赖建站模块插件

需要在构造中初始化时,先 parent::__construct(),再设置本控制器属性。

推荐写法

输出约定

方式说明
Service::V()->assign() / display()渲染 HTML 模板(前台主题或后台/应用 Views)
$this->_json($code, $msg, $data = [])返回 JSON 并结束请求;Ajax / 接口常用。$code 约定 1 成功、0 失败
$this->_jsonp(...)JSONP 输出
$this->_msg(...) / _admin_msg(...)页面消息跳转(前台 / 后台风格)
$this->_html_msg(...)进度类 HTML 消息(如缓存更新过程)

请求结束前可触发 cms_end 钩子(在 _json 等路径中)。避免在已输出 JSON 后再 display

请求与安全

  • 用常量判断请求:IS_POSTIS_AJAXIS_ADMINIS_API 等。

  • 开启 SYS_CSRF 时,POST 需带 CSRF;白名单 URI 由 Service::Filters() / 应用 Config/Filters.php 配置。API HTTP 场景可按规则跳过。

  • 读取输入优先用 \Phpcmf\Service::L('input'),并对文件名、参数做安全过滤(如 dr_safe_filename)。

  • 后台操作注意权限:角色节点与菜单 URI 一致;应用可按需增加 Auth 校验逻辑。

与菜单、权限的关系

后台菜单节点通常对应 {应用}/{控制器}/{方法} 形式的 URI。新增后台页面时:写好控制器方法 → 配置应用/My 菜单 → 给角色授权。仅写控制器不加菜单,管理员可能无法从界面进入。

禁止与推荐

  • 禁止:在 dayrui/Fcms/Control 新增或修改业务控制器。

  • 推荐:业务进 App/*/Controllers;确需改核心行为时用钩子或 My 覆盖类库/视图。

  • 推荐:控制器保持「调度」职责,数据访问放 Model,复用逻辑放 Library。

  • 推荐:列表增删改等标准后台页优先继承 \Phpcmf\Table,减少重复代码。

本文地址:https://m.xunruicms.com/doc/1479.html