## 關于控制器(C)
* 一個控制器包含多個操作(方法),操作方法是一個URL訪問的最小單元,每一次的URL訪問請求實則最終對應的就是這樣一個小單元。
* 當用戶通過一個固定的入口文件發起請求,最終是分配到控制器里的某一個操作去執行具體的業務處理。因此我們的開發過程主要就是通過不同的控制器去調度不同的業務邏輯,最終將處理后的結果反饋給用戶。
* 按請求流程常見的有:用戶發起請求頁面→預先配置一些處理規則→動態生成表單→填寫表單(輸入)→數據驗證合法后保存至數據庫→在需要的時候從數據庫查詢(輸出)→加載模板引擎→通過前端組件展現給瀏覽器。(以上步驟并非缺一不可)
* 如果您對ThinkPHP的控制器知識不熟悉,包括多級控制器、空控制器、資源控制器、Rest控制器等請瀏覽TP的[控制器](http://www.hmoore.net/manual/thinkphp5/118047)章節
~~~
http://serverName/index.php/模塊/控制器/操作/[參數名/參數值...]
~~~
## 基類控制器
DaiCuo中定義了四個基類控制器,強烈建議所有插件的控制器將根據項目場景基于這四個基類繼承來而開發(只有繼承了基類控制器才能正常使用呆錯框架內置的基礎模塊)。
~~~
apps/common/controller/Api.php //數據API基類控制器
apps/common/controller/Addon.php //后臺基類控制器
apps/common/controller/Base.php //框架基類控制器
apps/common/controller/Fron.php //前臺基類控制器
~~~
## 基礎結構
以首頁插件前臺的控制器繼承自`\app\common\controller\Front`這個前臺基類為例,示例如下:
```
<?php
namespace app\index\controller;
use app\common\controller\Front;
class Index extends Front
{
....
}
```
## 屬性和方法
當我們的控制器繼承自`apps\common\controller\Front`以后,我們就可以使用前臺基類的屬性與方法
~~~
// 系統全局變量屬性
protected $site = [];
// 地址欄參數屬性
protected $query = [];
// 系統權限屬性
protected $auth = [];
//前臺全局變量site
$this->site['user'] //用戶信息
$this->site['module'] //當前訪問模塊
$this->site['controll'] //當前訪問控制器
$this->site['action'] //當前訪問操作
$this->site['file'] //入口文件
$this->site['path_view'] //模板路徑
$this->site['path_root'] //根目錄路徑
$this->site['auth_rule'] //權限驗證規則
/**
* 繼承初始化方法
*/
protected function _initialize()
{
~~~~~~
}
~~~
## 子控制器/分層控制器
* 子控制器是不能夠被URL訪問直接調用到的,只能在訪問控制器、模型類的內部,或者視圖模板文件中進行調用。
* 為了方便調用,系統提供了controller助手函數直接實例化多層控制器;也可以使用助手函數action實現相同的功能。
* 在DaiCuo框架中,后臺應用的插件管理機制就是利用此特點來進行對插件應用后臺管理的調度。
```
$event = controller('Blog', 'event');
echo $event->update(5); // 輸出 update:5
echo $event->delete(5); // 輸出 delete:5
echo action('Blog/update', ['id' => 5], 'event'); // 輸出 update:5
```
利用分層控制器的機制,我們可以用來實現Widget(其實就是在模板中調用分層控制器),通俗一點的叫法就是小組件(如:內置的表單與表格模塊等)。
```
{:widget('Blog/header')}
{:widget('Blog/menu', ['name' => 'think'])}
```
## 關于操作
* 一個控制器包含多個操作(方法),操作方法是一個URL訪問的最小單元。
* 控制器命名沒有太多約束,根據自己喜歡決定,不要與內置的單啟沖突就行。
* 下面是一個典型的`Index`控制器的操作方法定義,包含了兩個操作方法:
~~~
namespace app\index\controller;
class Index
{
public function index()
{
return 'index';
}
public function hello($name)
{
return 'Hello,'.$name;
}
}
~~~