文件入口的功能与定义
入口文件是每个框架都有的, 是应用的起点, 完全框架的的基本配置与文件加载
文件入口定义
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']