ThinkPHP 8 多应用入口绑定:BIND_MODULE vs $http->name() 全面解析

你可能已经发现:define('BIND_MODULE', 'index') 和 $http->name('index')->run() 都能绑定应用,但行为却不一样。本文带你彻底搞懂两者的区别,以及多入口模式的正确配置方法。

一、先搞清楚你的场景

很多人在 ThinkPHP 8 中遇到绑定问题,根本原因是混淆了单入口和多入口模式。

1.1 单入口多应用模式

php 复制代码
访问:domain.com/index/test  → index应用
访问:domain.com/admin/test  → admin应用
入口文件:只有一个 index.php

1.2 多入口多应用模式

php 复制代码
访问:domain.com             → index应用(通过 index.php)
访问:domain.com/admin.php   → admin应用(通过 admin.php)
入口文件:index.php + admin.php(多个)

本文讨论的是第二种:多应用 + 多入口。

二、目录结构准备

php 复制代码
project/
├─ app/
│  ├─ index/                    # index应用
│  │  └─ controller/
│  │     ├─ Index.php           # 返回 11
│  │     └─ Test.php            # 返回 22
│  └─ admin/                    # admin应用
│     └─ controller/
│        ├─ Index.php           # 返回 33
│        └─ Test.php            # 返回 44
├─ public/
│  ├─ index.php                 # 前台入口
│  └─ admin.php                 # 后台入口
└─ ...
php 复制代码
// index/controller/Index.php代码:(能懂就可以忽略)
<?php
namespace app\index\controller;
use app\BaseController;
class Index extends BaseController
{

    public function index()
    {
        return 11;
    }
}
php 复制代码
// index/controller/Test.php代码:(能懂就可以忽略)
<?php
namespace app\index\controller;
use app\BaseController;
class Test extends BaseController
{

    public function index()
    {
        return 22;
    }
}
php 复制代码
// admin/controller/Index.php代码:(能懂就可以忽略)
<?php
namespace app\admin\controller;
use app\BaseController;
class Index extends BaseController
{

    public function index()
    {
        return 33;
    }
}
php 复制代码
// index/controller/Test.php代码:(能懂就可以忽略)
<?php
namespace app\admin\controller;
use app\BaseController;
class Test extends BaseController
{

    public function index()
    {
        return 44;
    }
}

三、两种绑定方式详解

3.1 方式一:define('BIND_MODULE', 'index')

php 复制代码
<?php
// public/index.php(前台入口)
define('BIND_MODULE', 'index');  // 必须在 require 之前!

use think\App;

require __DIR__ . '/../vendor/autoload.php';

$http = (new App())->http;
$response = $http->run();
$response->send();
$http->end($response);
php 复制代码
<?php
// public/admin.php(后台入口)
define('BIND_MODULE', 'admin');

use think\App;

require __DIR__ . '/../vendor/autoload.php';

$http = (new App())->http;
$response = $http->run();
$response->send();
$http->end($response);

3.2 方式二:$http->name('index')->run()

php 复制代码
<?php
// public/index.php(前台入口)
use think\App;

require __DIR__ . '/../vendor/autoload.php';

$http = (new App())->http;
$response = $http->name('index')->run();  // 链式调用绑定
$response->send();
$http->end($response);
php 复制代码
<?php
// public/admin.php(后台入口)
use think\App;

require __DIR__ . '/../vendor/autoload.php';

$http = (new App())->http;
$response = $http->name('admin')->run();
$response->send();
$http->end($response);

四、核心区别

绑定方式 可用访问请求
define('BIND_MODULE', 'index') /index/test ...
$http->name("index") /test /index.php/test ...
define('BIND_MODULE', 'admin') /admin.php/test ...
$http->name("admin") /admin.php/test ...

最终总结

这里还有其他很多的区别,但是首页或者说domain.com之下我不想用index.php/xxx或者index/xxx,而是直接通过domain.com/xxx来访问index应用下的控制器,那么$http->name()和BIND_MODULE的区别就非常非常明显了!

相关推荐
两个人的幸福8 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo10 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack10 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820711 天前
PHP 扩展——从入门到理解
php
鹏仔先生12 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下12 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip12 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒12 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog25012 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis12 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel