你可能已经发现: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的区别就非常非常明显了!