文件入口的功能与定义

入口文件是每个框架都有的, 是应用的起点, 完全框架的的基本配置与文件加载



文件入口定义

6.0默认的应用入口文件位于public/index.php,默认内容如下:

// [ 应用入口文件 ]
namespace think;

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

// 执行HTTP应用并响应
$http = (new  App())->make('http');
$response = $http->run();
$response->send();
$http->end($response);

如果你没有特殊的自定义需求,无需对入口文件做任何的更改。

入口文件位置的设计是为了让应用部署更安全,请尽量遵循public目录为唯一的web可访问目录,其他的文件都可以放到非WEB访问目录下面。

控制台入口文件

除了应用入口文件外,系统还提供了一个控制台入口文件,位于项目根目录的think(注意该文件没有任何的后缀)。

该文件代码如下:

#!/usr/bin/env php
<?php
namespace think;

// 加载基础文件
require __DIR__ . '/vendor/autoload.php';

// 应用初始化
(new App())->console->run();

控制台入口文件用于执行控制台命令,例如:

php think version

系统内置了一些常用的控制台命令,如果你安装了额外的扩展,也会增加相应的控制台指令,都是通过该入口文件执行的。

如果app目录下面直接是controller、model以及view等类库目录,则为单应用模式(默认模式),如果在app目录下创建了应用子目录,则自动变成多应用模式。

单应用和多应用的目录结构区别如下(主要在app目录)。

单应用模式

├─app 应用目录

│  ├─controller         控制器目录

│  ├─model              模型目录

│  ├─view               视图目录

│  └─ ...               更多类库目录

├─public                WEB目录(对外访问目录)

│  ├─index.php          入口文件

│  ├─router.php         快速测试文件

│  └─.htaccess          用于apache的重写

├─config                应用配置目录

├─route                 路由定义目录

├─runtime               应用的运行时目录

多应用模式

├─app 应用目录

│  ├─index              主应用

│  │  ├─controller      控制器目录

│  │  ├─model           模型目录

│  │  ├─view            视图目录

│  │  ├─config          配置目录(优先)

│  │  └─ ...            更多类库目录

│  ├─admin               后台应用

│  │  ├─controller      控制器目录

│  │  ├─model           模型目录

│  │  ├─view            视图目录

│  │  ├─config          配置目录(优先)

│  │  └─ ...            更多类库目录

├─public                WEB目录(对外访问目录)

│  ├─admin.php          后台入口文件

│  ├─index.php          入口文件

│  ├─router.php         快速测试文件

│  └─.htaccess          用于apache的重写

├─config                应用配置目录

│  ├─index              index应用配置

│  └─admin              admin应用配置

├─route                 路由定义目录

│  ├─index              index应用路由定义目录

│  └─admin              admin应用路由定义目录

├─runtime               运行时目录

│  ├─index              index应用运行时目录

│  └─admin              admin应用运行时目录

从目录结构可以看出来,每个应用相对保持独立,并且每个应用都有一个对应的入口文件,应用下面还可以通过多级控制器来维护控制器分组。

多应用使用不同的入口的情况下,每个入口文件的内容都是一样的,默认入口文件名(不含后缀)就是应用名,如果你的入口文件名和应用不一致,例如你的后台admin应用,入口文件名使用了think.php,那么入口文件需要改成:

// [ 应用入口文件 ]
namespace think;

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

// 执行HTTP应用并响应
$http = (new  App())->make('http');
$response = $http->name('admin')->run();
$response->send();
$http->end($response);

单应用和多应用模式会影响一些系统路径的值,为了更好的理解本手册的内容,你可能需要理解下面几个系统路径所表示的位置。


目录位置目录说明获取方法
根目录项目所在的目录,默认自动获取,可以在入口文件实例化App类的时候传入。App::getRootPath()
基础目录根目录下的app目录App::getBasePath()
应用目录当前应用所在的目录,如果是单应用模式则同基础目录,如果是多应用模式,则是app/应用子目录App::getAppPath()
配置目录根目录下的config目录App::getConfigPath()
运行时目录框架运行时的目录,单应用模式就是根目录的runtime目录,多应用模式为runtime/应用子目录App::getRuntimePath()
核心类库目录框架核心类库的think目录App::getThinkPath()

注意:应用支持使用composer包,这个时候目录可能是composer包的类库所在目录。


对于非自动多应用部署的情况,如果要加载composer应用,需要在入口文件中设置应用路径:

// [ 应用入口文件 ]
namespace think;

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

// 执行HTTP应用并响应
$http = (new  App())->make('http');
$response = $http->path('path/to/app')->run();
$response->send();
$http->end($response);

自动多应用部署

支持在同一个入口文件中访问多个应用,并且支持应用的映射关系以及自定义。

只需要在config/app.php配置文件中设置

// 开启自动多应用模式
'auto_multi_app'    =>    true,

就可以不必为每个应用创建入口文件而是可以通过index.php入口文件自动访问多个应用,如果采用多入口方式的URL访问是:

// 访问admin应用
http://serverName/admin.php
// 访问shop应用
http://serverName/shop.php

开启自动多应用模式后,变成

// 访问admin应用
http://serverName/index.php/admin
// 访问shop应用
http://serverName/index.php/shop

也就是说pathinfo地址的第一个参数就表示当前的应用名,后面才是该应用的路由。

如果直接访问

http://serverName/index.php

访问的其实是index应用(默认为入口文件名),如果你的默认应用不是index,那么可以通过default_app配置参数指定默认应用。

// 设置默认应用名称
'default_app' => 'home',

接着访问

http://serverName/index.php

其实访问的是home应用。

应用映射

应用映射仅支持自动多应用模式

支持应用的别名映射,例如:

'app_map' => [
    'think'  =>  'admin',  // 把admin应用映射为think
],

应用映射后,原来的应用名将不能被访问,例如上面的admin应用不能直接访问,只能通过think应用访问。

如果要使用composer加载应用,需要设置

'app_map'    =>    [
    'think' => function($app) {
        $app->path('path/to/composer/app');
    },
],

域名绑定应用

如果你的多应用使用多个子域名或者独立域名访问,你可以在config/app.php配置文件中定义域名和应用的绑定。

禁止应用访问

禁止应用访问仅支持自动多应用模式

你如果不希望某个应用通过URL访问,例如,你增加了一个common子目录用于放置一些公共类库,你可以设置

'deny_app_list' =>    ['common']