编写控制器时请遵守命名、命名空间、继承与输出约定,以便路由能正确找到类与方法,并与模板、权限、CSRF 等机制兼容。
一个控制器一个 PHP 文件;文件名与类名一致,首字母大写(如 Home.php → class 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_POST、IS_AJAX、IS_ADMIN、IS_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,减少重复代码。