迅睿通过 PSR-4 风格自动加载解析类文件,并用 \Phpcmf\Service 门面统一获取类库、模型、视图等对象。理解命名空间映射与加载优先级,是二次开发与应用开发的基础。

自动加载

System/Init.php 中注册 \Phpcmf\Auto。加载配置由 \Phpcmf\Service::Auto() 组装,包括:

  • 核心 PSR-4 / classmap

  • 已安装应用的 Config/Auto.php(可追加命名空间与 classmap)

  • 同时加载已安装应用的 Hooks.phpFilters.phpMwhere.php

核心命名空间映射

命名空间目录说明
Phpcmf\Controldayrui/Fcms/Control/系统核心控制器
Phpcmf\Controllers{APPPATH}/Controllers/当前应用控制器
Phpcmf\Librarydayrui/Fcms/Library/系统类库
Phpcmf\Fielddayrui/Fcms/Field/字段类型
Phpcmf\Extenddayrui/System/Extend/框架扩展(如 Run)
My\Library / My\Model / My\Fielddayrui/My/...二次开发覆盖
CodeIgniter / ConfigFRAMEPATH 及其 Config底层框架相关

核心基类多通过 classmap 固定路径,例如:

  • Phpcmf\CommonFcms/Core/Common.php(控制器公共基类)

  • Phpcmf\AppFcms/Core/App.php

  • Phpcmf\ModelFcms/Core/Model.php

  • Phpcmf\ViewFcms/Core/View.php

  • Phpcmf\TableFcms/Core/Table.php

若已安装建站模块(IS_USE_MODULE),部分类(如 Phpcmf\Model\Content)会映射到模块扩展路径。

应用扩展自动加载

在应用目录创建 Config/Auto.php,返回数组可追加 psr4classmap。仅当应用存在 install.lock 时才会被 Service::Auto() 合并。

Service 门面

\Phpcmf\Service 是统一入口,常用方法如下:

方法作用示例
L($name, $namespace = '')获取类库对象(单例)\Phpcmf\Service::L('cache')
M($name = '', $namespace = '')获取模型;M() 无参返回模型基类实例\Phpcmf\Service::M('auth')
V()模板视图对象\Phpcmf\Service::V()->display('xxx.html')
C()当前控制器实例\Phpcmf\Service::C()
R($file)require 并缓存文件返回值读取配置 PHP 文件
H($name, $namespace)加载应用 Helpers\Phpcmf\Service::H('xxx', 'app')
Apps($is_install = 0)扫描应用列表;传 1 仅已安装\Phpcmf\Service::Apps(1)
Filters()CSRF 等过滤器白名单 URI按前台/会员/后台场景返回

Helper 中提供同名简化函数:XR_L()XR_M()XR_V()XR_C()XR_R()XR_H()XR_DB()(数据库连接)。

类库 / 模型加载优先级

Service::L() / Service::M() 按「核心文件 + 可覆盖文件」解析(应用类库目录名为 Libraries/,模型为 Models/):

  1. 优先加载核心 Fcms/Library|Model/{Name}.php

  2. 若存在 My/Library|Model/{Name}.php,则作为覆盖类(命名空间 My\...)。

  3. 指定 $namespace(应用名)时,可加载该应用下对应文件,并实例化为 \Phpcmf\Library\{App}\{Name}\Phpcmf\Model\{App}\{Name}

  4. 核心不存在该类时,可直接使用应用或 My 目录中的实现。

调用示例:

// 系统类库
\Phpcmf\Service::L('router');

// 指定应用命名空间的类库/模型
\Phpcmf\Service::L('xxx', 'news');
\Phpcmf\Service::M('content'); // 建站模块相关模型会自动关联 module

开发建议

  • 覆盖系统类库/模型:放到 dayrui/My/Library/dayrui/My/Model/,类名与核心一致。

  • 应用私有能力:写在应用 Libraries/Models/,并通过 Service::L/M($name, $app) 或 Auto.php 注册命名空间引入。

  • 不要修改 Fcms/ 内类文件;升级时 My 与 App 中的扩展可保留。

  • 对象多为单例缓存,同一请求内重复 L/M 同一标识会复用实例。

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