ThinkPHP项目多应用模块划分

wen PHP项目 3

本文目录导读:

ThinkPHP项目多应用模块划分

  1. 目录结构规划
  2. 安装与启用多应用模式
  3. 核心配置详解
  4. 代码实现示例
  5. 应用级配置与中间件
  6. 跨应用调用与依赖
  7. 部署注意事项
  8. 快速生成命令

在 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;

部署注意事项

  1. 目录权限:确保 runtime/ 目录可写。
  2. 入口文件public/index.php 为唯一入口,禁止直接访问 app/ 目录。
  3. 路由缓存:生产环境执行 php think optimize:route 加速。
  4. 多应用模式开关:如果单应用就够用,无需安装该扩展。

快速生成命令

使用命令行快速生成应用目录:

# 创建 admin 应用
php think build admin
# 创建 api 应用
php think build api

该命令会自动生成 app/admin/controller/Index.php 等基础文件。


多应用模式的核心优势

  • 逻辑隔离:前后台互不干扰,API 独立开发。
  • 权限隔离:每个应用可配置独立中间件、Session。
  • 部署灵活:可通过域名或路径区分访问入口。
  • 维护效率:团队分工明确,共用核心库的同时互不影响。

通过合理规划 app/ 目录结构,配合中间件和配置分离,可以构建出清晰、可扩展的企业级应用架构。

抱歉,评论功能暂时关闭!