webman原生即多应用架构,无需app_multi开关,靠目录结构、路由分发和psr-4命名空间显式定义应用边界;删除app/admin目录即移除该应用,新增应用只需建目录+写路由+补命名空间。

Webman 本身不提供 ThinkPHP 那类「多应用模式」的开关式配置,它原生就是多应用架构——不是靠 app_multi 或扩展包启用,而是靠目录结构 + 路由分发 + 命名空间显式定义来实现。你建了 app/admin 和 app/api,它们天然就是独立应用,无需额外开启「多应用模式」。
为什么 Webman 没有 app_multi 配置项
Webman 的设计哲学是「约定优于配置」:应用边界由物理目录决定,而非运行时开关。框架启动时会扫描 app/ 下所有子目录(如 admin、api),只要该目录下存在 controller/ 和 config/,就视为一个有效应用。没有 app_multi 这种开关,是因为它根本不需要——单应用只是多应用的退化特例(即只保留 app/index)。
常见错误现象:Class not found: app\admin\controller\IndexController,往往不是配置没开,而是:
-
app/admin/controller/IndexController.php文件不存在,或类声明写成namespace app\Admin\controller;(大小写错) -
config/app.php中未正确定义'applications'键,导致框架无法识别该应用的命名空间根 - 路由里写的控制器类路径和实际命名空间不匹配,比如写了
[app\admin\controller\Index::class, 'index'],但文件里是namespace app\admin\controller;(少了个\)
如何让 admin 和 api 应用真正隔离运行
关键不在「启用」,而在「分发」和「隔离」。Webman 默认把所有请求都交给 app/index 处理,你要手动把特定路径的请求路由到对应应用。
以子目录方式分发为例(访问 /admin/xxx 进 admin 应用):
- 在
config/route.php中添加前缀路由组:Route::group('/admin', function () { Route::import('admin'); }); -
Route::import('admin')会自动加载app/admin/route.php,而不是全局route.php - 确保
app/admin/route.php里的路由不带/admin前缀,例如写Route::get('/dashboard', [...]),最终访问地址是/admin/dashboard - 每个应用的
config/目录下可放独立的database.php、cache.php等,它们只对当前应用生效,无需任何「覆盖开关」
为什么不能直接复制 ThinkPHP 的多应用配置逻辑
ThinkPHP 的 app_multi 是为兼容单应用历史包袱而设计的运行时判断机制;Webman 没有这个包袱,它的多应用是编译期(启动期)确定的。这意味着:
- 你删掉
app/admin目录,admin应用就彻底消失,不用清缓存、不用改配置 - 新增应用只需建目录 + 写路由 + 补命名空间,不需要执行
php think app:create这类命令(Webman 没这命令) -
app/common是共享模块,但它的代码不会自动加载进所有应用——必须在各应用的composer.json的autoload里显式声明 PSR-4 映射,否则app\common\model\User在app/api里仍会报错 - Webman 不支持域名级应用映射(如
admin.example.com → app/admin),需靠 Nginx/Apache 的location或反向代理规则先重写路径,再交由 Webman 的子目录路由处理
容易被忽略的初始化细节
Webman 启动后所有应用共享同一个进程和内存空间,但每个应用的 config/ 是独立加载的。最容易踩的坑是:在 app/admin/config/app.php 里改了 'default_timezone',却发现 app/api 的日志时间也变了——这是因为 date_default_timezone_set() 是全局生效的,不是配置项隔离能控制的。类似情况还有 error_reporting、mb_internal_encoding 等运行时设置,必须在各应用的入口(如控制器构造函数或中间件)中显式调用,不能依赖配置文件。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











