## 多應用模式
默認安裝好的目錄結構是下面這樣的。只列出了兩級,并去除了現在無需關注的細節,如Readme、版權聲明文件等。
~~~
├── app
│ ├── AppService.php
│ ├── BaseController.php
│ ├── ExceptionHandle.php
│ ├── Request.php
│ ├── common.php
│ ├── controller
│ ├── event.php
│ ├── middleware.php
│ ├── provider.php
│ └── service.php
├── config
│ ├── app.php
│ ├── cache.php
......
│ ├── trace.php
│ └── view.php
├── extend
├── public
│ ├── index.php
│ ├── router.php
│ └── static
├── route
│ └── app.php
├── runtime
├── think
├── vendor
│ ├── autoload.php
......
│ └── topthink
└── view
~~~
默認安裝好后,是單應用模式的,常常無法滿足項目需要。下面,我們要將其改造成多應用模式。一個應用系統,至少要分為前后臺兩個應用吧?另外,我還想有一個測試`(test)`的地方,演示的地方`(demo)`。
> 如果要使用多應用模式,需要先安裝多應用模式擴展`think-multi-app`。方法如下:
~~~
/* 安裝多應用支持 */
composer require topthink/think-multi-app
/*
安裝視圖模板,不安裝也可以,
但是需要修改`config/view.php`,
將其中的`type='Think' `改成 `type='php'`
*/
composer require topthink/think-view
~~~
成功安裝后,我們來測試一下控制器生成命令。
## 快速生成應用
如果使用了多應用模式,可以快速生成一個應用,例如生成`index`,`demo`、`admin`、`test`應用的指令如下:
~~~
$ php think build index
$ php think build demo
$ php think build admin
$ php think build test
/* 框架已經內置了 index 應用 */
~~~
~~~
/* 創建 admin 應用,同時創建 Index 控制器 */
/* v6.0.10 會自動創建下面的目錄,故可以省略 */
$ php think make:controller admin@Index
Controller:app\admin\controller\index created successfully.
/* 創建 index應用,同時創建 Index 控制器 ,注意首字母的大小寫*/
$ php think make:controller index@Index
Controller:app\index\controller\index created successfully.
/* 同時創建 一個用于演示或者測試的demo應用*/
$ php think make:controller demo@Index
$ php think make:controller test@Index
Controller:app\demo\controller\Index created successfully.
~~~
> 以上的命令一定要在框架的根目錄位置執行。
多應用模式下,記得要刪除`app`目錄下的`controller`目錄(系統據此判斷是否為多應用部署),以避免混亂。可以備份一下。`mv controller controller.org`
* * *
修改`app/admin/controller/index.php`文件,如下。
~~~
<?php
declare (strict_types = 1);
namespace app\admin\controller;
use think\Request;
class index
{
/**
* 顯示資源列表
*
* @return \think\Response
*/
public function index()
{
// 添加此行
return 'admin::index';
}
......
~~~
在實際的部署中,為了安全起見,要確保只有`public`目錄可以對外訪問。在`mac`或者`linux`環境下面,可能還需要設置`runtime`目錄權限為nobody可寫。操作命令如下:
~~~
// 必要時設置目錄權限(Linux / MacOS)
chmod -R 777 <project_name>/runtime
~~~
或者:
~~~
// 不同的Linux發行版本可能不一致,需要根據實際情況調整
chown -R nobody:nobody <project_name>/runtime
~~~
下面給出了多應用部署的文件結構,不同的是`app`目錄下面沒有`controller`目錄,而`admin`應用下面有一個新建的`controller`目錄。
~~~
├── app 應用根目錄
│ ├── AppService.php
│ ├── BaseController.php 默認基礎控制器類
│ ├── ExceptionHandle.php 應用異常定義文件
│ ├── Request.php 應用請求對象
│ ├── admin 應用目錄
│ │ └── controller 控制器目錄
│ ├── common.php 公共函數文件
│ ├── event.php 全局事件定義文件
│ ├── middleware.php 全局中間件定義文件
│ ├── provider.php 服務提供定義文件
│ └── service.php
~~~
`BaseController.php`、`Request.php`和`ExceptionHandle.php`三個文件是系統默認提供的基礎文件,位置可以隨意移動,但要同步調整類的命名空間。如果不需要使用`Request.php`和`ExceptionHandle.php`文件,或者要調整類名,記得必須同步調整`provider.php`文件中的容器對象綁定。`provider.php`服務提供定義文件只能全局定義,不支持在應用下單獨定義。
* * *
## 全局配置
與`app`目錄同級的`config`目錄下面的文件是項目的全局配置文件,對所有應用有效。通過源碼可以看到全局參數的加載過程如下。
~~~
if (is_dir($configPath)) {
$files = glob($configPath . '*' . $this->configExt);
}
foreach ($files as $file) {
$this->config->load($file, pathinfo($file, PATHINFO_FILENAME));
}
~~~
## 應用級配置
每個應用可以有獨立的配置文件,相同的配置參數會覆蓋全局配置。每個應用下面的配置文件會被默認加載。通過源碼可以看到加載過程如下。
~~~
$files = array_merge($files, glob($appPath . 'config' . DIRECTORY_SEPARATOR . '*' . $this->app->getConfigExt()));
foreach ($files as $file) {
$this->app->config->load($file, pathinfo($file, PATHINFO_FILENAME));
}
~~~
如果需要加載額外的配置文件,需要手動加載,方法如下。
~~~
// 加載config/extra/config.php 配置文件 讀取到extra
\think\facade\Config::load('extra/config', 'extra');
~~~
## 配置獲取
要使用`Config`類,首先需要在你的類文件中引入
~~~
use think\facade\Config;
~~~
讀取一級配置的所有參數(每個配置文件都是獨立的一級配置)
~~~
Config::get('app');
//或者使用助手函數
config('app');
~~~
讀取單個配置參數
~~~
Config::get('app.default_timezone');
//或者使用助手函數
config('app.default_timezone');
~~~
讀取數組配置(理論上支持無限級配置參數讀取)
~~~
Config::get('database.default.host');
~~~
讀取全部配置(含應用級的配置文件)
~~~
Config::get();
~~~
判斷是否存在某個設置參數:
~~~
echo (bool)Config::has('app.app_name');
echo (bool)Config::has('app.default_timezone');
~~~
動態修改配置參數:
~~~
// 支持批量設置參數
Config::set(['perpage' => 20], 'pagination');
echo Config::get('pagination.perpage');
~~~
## 獲取各種目錄位置
| 目錄位置 | 目錄說明 | 獲取方法 |
| --- | --- | --- |
| 根目錄 | 項目所在的目錄,默認自動獲取,可以在入口文件實例化`App`類的時候傳入。 | `App::getRootPath()` |
| 基礎目錄 | 根目錄下的`app`目錄 | `App::getBasePath()` |
| 應用目錄 | 當前應用所在的目錄,如果是單應用模式則同基礎目錄,如果是多應用模式,則是`app`/應用子目錄 | `App::getAppPath()` |
| 配置目錄 | 根目錄下的`config`目錄 | `App::getConfigPath()` |
| 運行時目錄 | 框架運行時的目錄,單應用模式就是根目錄的`runtime`目錄,多應用模式為`runtime`/應用子目錄 | `App::getRuntimePath()` |
| 核心類庫目錄 | 框架核心類庫的`think`目錄 | `App::getThinkPath()` |
測試代碼:
~~~
use think\facade\App;
$a[] = App::getRootPath(); // myproject/
$a[] = App::getBasePath(); // myproject/app/
$a[] = App::getAppPath(); // myproject/app/admin/
$a[] = App::getConfigPath(); // myproject/config/
/* 這個要注意一下,不是`runtime`的根目錄 */
$a[] = App::getRuntimePath(); // myproject/runtime/admin/
$a[] = App::getThinkPath(); // myproject/vendor/topthink/framework/src/
/* 獲取當前應用的名稱 */
$a[] =app('http')->getName();
print_r($a);
~~~
- 搭建ThinkPHP6的開發環境
- 配置ThinkPHP6
- 必要的基礎知識(basic)
- MVC開發模式
- 控制器(controller)
- 數據庫(database)
- 模型(model)
- 模型關聯(relation)
- 視圖(view)
- Session
- Cookie
- 緩存(cache)
- 上傳(upload)
- 驗證器(validate)
- 驗證碼(captcha)
- 命令行(command)
- 服務器部署(deploy)
- 數據備份(backup)
- 數據同步(synchronization)
- 訂閱服務(subscribe)
- PHP 易混淆知識點
- 助手函數
- MySQL規范
- Redis 規范
- office插件 phpoffice
- 拼音插件 pinyin
- 日期插件 datetime
- 消息插件 amqp
- 產品部署環境的搭建
- PDF 等雜項處理
- 文件上傳
- 常用擴展
- flc/dysms
- 使用示例 ①
- 使用示例 ②
- qiniu/php-sdk
- 簡介
- 使用示例
- 使用示例 2 ②
- liliuwei/thinkphp-jump
- 擴展介紹
- 下載擴展
- 使用方法
- topthink/think-captcha
- 安裝擴展
- 驗證碼顯示
- 更換驗證碼
- 驗證碼校驗
- 驗證碼配置
- 自定義驗證碼
- phpoffice/phpspreadsheet
- 數據寫入表格
- 讀取表格數據
- topthink/think-queue
- 安裝
- 自定義函數
- 任務類
- 帶有日志的任務類