FuelPHP 7.1 的模块化依赖框架原生机制而非 Composer,模块必须置于 fuel/app/modules/ 下并含 Module.php,需手动注册路由、autoload 和配置,无自动 DI 与跨模块依赖解析。

PHP 7.1 下 FuelPHP 的模块化不是靠 Composer 自动加载驱动的,而是依赖框架原生的 fuel/app/modules/ 目录结构和运行时加载机制。直接套用 Laravel 或现代 PSR-4 模块方案会失败。
模块目录必须放在 fuel/app/modules/ 下
FuelPHP 不识别 Modules/ 或自定义 PSR-4 命名空间路径。所有模块必须严格置于 fuel/app/modules/ 内,且每个模块需包含自己的 Module.php 文件(继承 FuelCoreModule)。
- 错误做法:
composer.json中添加"Modules\": "Modules/"并期望自动加载 —— FuelPHP 启动时不读取vendor/autoload.php,该配置无效 - 正确结构示例:
fuel/app/modules/user/Module.php、fuel/app/modules/user/classes/controller/user.php - 模块类命名空间固定为
ModuleUser(对应模块名user),不能随意改成AppModulesUser
Module.php 必须实现 init() 和 register_autoloader()
FuelPHP 在启动时通过反射调用每个模块的 Module.php 中的 init() 方法,并默认尝试调用 register_autoloader() 注册该模块内的类自动加载规则。
- 若省略
register_autoloader(),模块内classes/下的类(如classes/model/user.php)将无法被自动识别,报错Class 'Model_User' not found - 典型写法:
Autoloader::add_classes(array('Model_User' => __DIR__.'/classes/model/user.php')); -
init()中可设置$this->config、绑定事件监听器或初始化服务,但不能执行耗时操作(如 DB 连接),否则拖慢整个应用启动
路由必须显式启用模块并声明前缀
FuelPHP 不自动扫描模块路由文件。你得在 fuel/app/config/routes.php 中手动注册模块路由,否则访问 /user/login 会 404。
立即学习“PHP免费学习笔记(深入)”;
- 启用模块路由的标准写法:
Route::add('user(/:action)', array('module' => 'user', 'controller' => 'user')); - 模块内路由文件(如
fuel/app/modules/user/config/routes.php)不会被自动加载,必须在主路由中require或用Route::add显式挂载 - 模块控制器路径固定为
fuel/app/modules/{name}/classes/controller/{name}.php,不能改成controllers/UserController.php
数据库迁移与配置隔离需手动处理
FuelPHP 的 oil generate migration 默认只作用于 fuel/app,不感知模块。模块专属迁移、模型配置、连接参数都得自己组织。
- 模块专属 migration 文件应放在
fuel/app/modules/{name}/migrations/,并在oil refine migrate时用--path指定:oil refine migrate --path=fuel/app/modules/user/migrations - 模块数据库配置不能写在
fuel/app/modules/{name}/config/db.php—— FuelPHP 不自动加载模块 config,需在Module.php->init()中手动Config::load('db', true)并 merge 配置 - 模型类若使用
OrmModel,必须确保其$_table_name和$_connection显式指定,避免误用主应用默认连接
最易被忽略的是:FuelPHP 模块间没有服务容器或依赖注入机制,Module::load() 只是简单 include,模块 A 调用模块 B 的类前,必须确保 B 已被加载且其 autoloader 已注册 —— 这个顺序依赖需要人工维护,不能靠自动解析。



















