本文目录导读:

在 ThinkPHP 6/8 中,多应用模式是官方推荐的项目结构之一,用于将不同功能模块(如前台、后台、API)拆分为独立的应用目录,便于维护和团队协作。
以下是一个标准的 ThinkPHP 多应用项目目录结构及配置指南:
目录结构规划
project_root/ ├── app/ # 应用目录(核心) │ ├── common.php # 公共函数文件 │ ├── event.php # 事件定义 │ ├── provider.php # 容器绑定 │ ├── middleware.php # 全局中间件 │ ├── index/ # 前台应用(默认) │ │ ├── controller/ │ │ │ └── Index.php │ │ ├── model/ │ │ ├── view/ │ │ └── config/ # 应用级配置(可选) │ ├── admin/ # 后台应用 │ │ ├── controller/ │ │ │ └── Login.php │ │ ├── middleware.php # 应用级中间件(如登录验证) │ │ └── ... │ └── api/ # 接口应用 │ ├── controller/ │ │ └── User.php │ └── ... ├── config/ # 全局配置 ├── public/ # Web 根目录 │ ├── index.php │ └── .htaccess ├── route/ # 全局路由 ├── runtime/ # 运行时目录 └── vendor/ # 依赖包
安装与启用多应用模式
步骤1:安装多应用扩展(TP6 需要,TP8 默认已集成)
composer require topthink/think-multi-app
步骤2:验证配置
在 config/app.php 中检查:
// 是否开启多应用模式(TP8 默认 true) 'auto_multi_app' => true, // 默认应用 'default_app' => 'index',
核心配置详解
1 应用路由规则
- URL格式:
http://域名/应用名/控制器/操作 - 示例:
http://example.com/admin/login/index→ 后台登录页http://example.com/api/user/list→ API 接口
2 隐藏入口文件(伪静态)
在 public/.htaccess(Apache)或 Nginx 配置中:
Apache:
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
Nginx:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
3 独立域名绑定(可选)
如果需要 admin.example.com 绑定后台,api.example.com 绑定API,可在 config/app.php 中配置:
'domain_bind' => [
'admin' => 'admin.example.com',
'api' => 'api.example.com',
'*' => 'index', // 其他域名走前台
],
代码实现示例
1 前台应用(app/index/controller/Index.php)
<?php
declare(strict_types=1);
namespace app\index\controller;
use think\Response;
class Index
{
public function index(): Response
{
return response('Hello 前台首页!');
}
}
2 后台应用(app/admin/controller/Login.php)
<?php
declare(strict_types=1);
namespace app\admin\controller;
use think\Request;
class Login
{
public function index(Request $request)
{
if ($request->isPost()) {
$username = $request->post('username');
$password = $request->post('password');
// 验证逻辑...
return json(['code' => 0, 'msg' => '登录成功']);
}
return view('login/index'); // 模板路径:app/admin/view/login/index.html
}
}
3 API 应用(app/api/controller/User.php)
<?php
declare(strict_types=1);
namespace app\api\controller;
use think\Response;
class User
{
public function list(): Response
{
// 数据从模型获取
$data = ['name' => 'ThinkPHP', 'version' => '8.0'];
return json(['code' => 0, 'data' => $data]);
}
}
应用级配置与中间件
1 为后台配置登录验证中间件
创建 app/admin/middleware.php:
<?php
return [
// 后台全局中间件
app\admin\middleware\CheckLogin::class,
];
创建中间件类 app/admin/middleware/CheckLogin.php:
<?php
declare(strict_types=1);
namespace app\admin\middleware;
use think\Request;
class CheckLogin
{
public function handle(Request $request, \Closure $next)
{
// 检查 Session 中是否有管理员信息
if (!session('admin_id')) {
// 跳转到登录页
return redirect('/admin/login/index');
}
return $next($request);
}
}
2 独立数据库配置
为 api 应用创建 app/api/config/database.php:
<?php
return [
'default' => 'mysql_api',
'connections' => [
'mysql_api' => [
'host' => '127.0.0.1',
'database' => 'api_db',
'username' => 'root',
'password' => '123456',
],
],
];
跨应用调用与依赖
1 跨应用调用控制器
use think\facade\App; // 方式一:通过 think\facade\App 调用 $result = App::invokeMethod(['app\admin\controller\Index', 'index']);
2 公共模型放置在 app/common/model/
如果多个应用共用数据模型,将模型放于 app/common/model/,在控制器中引用:
use app\common\model\User;
部署注意事项
- 目录权限:确保
runtime/目录可写。 - 入口文件:
public/index.php为唯一入口,禁止直接访问app/目录。 - 路由缓存:生产环境执行
php think optimize:route加速。 - 多应用模式开关:如果单应用就够用,无需安装该扩展。
快速生成命令
使用命令行快速生成应用目录:
# 创建 admin 应用 php think build admin # 创建 api 应用 php think build api
该命令会自动生成 app/admin/controller/Index.php 等基础文件。
多应用模式的核心优势:
- ✅ 逻辑隔离:前后台互不干扰,API 独立开发。
- ✅ 权限隔离:每个应用可配置独立中间件、Session。
- ✅ 部署灵活:可通过域名或路径区分访问入口。
- ✅ 维护效率:团队分工明确,共用核心库的同时互不影响。
通过合理规划 app/ 目录结构,配合中间件和配置分离,可以构建出清晰、可扩展的企业级应用架构。