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的区别就非常非常明显了!

相关推荐
大鱼>1 天前
共识算法:从PBFT到HotStuff的拜占庭容错演进
区块链·php·共识算法
正在走向自律1 天前
使用atop工具监控Linux系统指标
linux·运维·php·实时监控·atop分析内存
2401_894915532 天前
Geo 优化源码部署常见报错排查:连接失败、地图加载、地域词失效解决方案
服务器·开发语言·python·安全·php
2601_965798472 天前
My Honest Review of Rank Math SEO Pro for Beginner Sites
数据库·人工智能·php
vx-程序开发2 天前
django医院预约挂号系统---附源码23353
java·javascript·spring boot·python·eclipse·django·php
三8442 天前
RCE长度&字符限制绕过
开发语言·php
莫凡的博客2 天前
火山引擎-基础入门阶段细化实操案例
人工智能·php·火山引擎
代龙涛2 天前
WordPress sidebar.php 侧边栏开发教程
开发语言·php·wordpress
weixin_BYSJ19872 天前
springboot医疗信息管理系统---附源码17465
java·javascript·spring boot·python·django·flask·php
三8442 天前
有限字符RCE绕过/蚁剑/usort变长参数绕过
php