Webman天生是多应用架构,无需开启;必须同时满足两个硬性条件:app/下存在标准子应用目录(如app/admin),且config/app.php中显式配置applications数组,键名为URL路径前缀、值含controller_namespace,三者严格对齐才能触发应用级路由、中间件与异常处理。

app/ 下建了 admin 目录却没生效?检查 applications 配置
常见错误现象:app/admin/controller/IndexController 写好了,route.php 也配了 Route::get('/admin', [...]),但访问 /admin 时抛出 Class appcontrollerIndexController does not exist。
原因很直接:Webman 不会自动扫描 app/ 下的子目录并“启用”它们。它只认 config/app.php 里 applications 数组中明确列出的键。
实操建议:
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 确保
app/admin/下存在controller/、config/(至少空目录)等标准结构 - 编辑
config/app.php,添加如下配置(注意键名必须是admin,不能是Admin或administrator):'applications' => [ 'admin' => [ 'controller_namespace' => 'app\admin\controller', ], ] - 键名
admin必须和 URL 路径第一段完全一致:访问/admin/dashboard才会触发该配置;访问/v1/users不会命中admin,除非你额外加一个'v1'键
为什么 route.php 里写 Route::get('/api/users', ...) 还是走全局控制器?
这是最典型的误解:以为在某个子应用的 route.php(比如 app/api/route.php)里写路由,就能让框架自动识别作用域。实际上,Webman 的路由文件本身没有“作用域”,它只是被加载的 PHP 脚本;真正决定路由归属的是请求路径前缀与 applications 键名的匹配关系。
实操建议:
-
app/api/route.php可以写Route::get('/users', [...]),但必须配合applications['api']配置,且用户实际访问的是/api/users(不是/users) - 不要在
config/route.php(全局路由)里重复定义/api/xxx,否则可能覆盖应用级路由逻辑 - 如果想支持无前缀访问(如直接
/users),得用中间件或插件(如webman/domain)做 Host 头识别,而不是靠改路由
中间件和异常处理器不按应用隔离?一定是 config/middleware.php 或 config/exception.php 没配对
现象:API 报错返回 HTML 页面,前端解析失败;或者管理员登录校验中间件在 API 请求里也被执行了。
根本原因:Webman 的中间件和异常处理器都依赖 config/middleware.php 和 config/exception.php 中的数组键名来匹配应用。键名为空字符串 '' 是全局,其他键名(如 'api'、'admin')才对应具体应用。
实操建议:
-
config/middleware.php必须这样写:return [ '' => [supportmiddlewareGlobalLog::class], 'api' => [supportmiddlewareCors::class, supportmiddlewareRateLimit::class], 'admin' => [supportmiddlewareAdminAuth::class], ]; -
config/exception.php同理:return [ 'api' => supportexceptionApiHandler::class, 'admin' => supportexceptionAdminHandler::class, ]; - 没配
'api'键,所有/api/下的异常都会 fallback 到全局 handler,也就是''对应的那个类
删掉 app/admin 目录后还能访问 /admin/xxx?别忘了清配置缓存
Webman 在生产环境默认启用配置缓存,config/app.php 修改后不会实时生效。更隐蔽的是:即使你删了 app/admin 目录,只要 applications 数组里还留着 'admin' => [...],框架仍会尝试加载命名空间,然后报 Class not found。
实操建议:
- 删除应用目录后,务必同步删掉
config/app.php中对应的applications条目 - 修改完任何 config 文件,运行
php start.php restart并确认输出中没有警告或 autoload 错误 - 如仍异常,手动删掉
runtime/cache/config.php(如果存在),强制重建配置缓存
applications 数组;很多人卡在第一步,就是因为只建了目录,却忘了在配置里“点名”。

















