[TOC]
# 1.4 創建控制器
## 1.4.1 控制器概念
在XPHP中,每一次請求,首先會交給`Handler`解析,然后經過`Route`(路由)分配,接下來就是到了`Controller`(控制器)手中。
控制器是您編寫業務邏輯代碼的地方。
所有控制器文件都應這樣命名:`/App/應用名稱/控制器名稱.class.php`。
控制器名稱命名規范:大駝峰,最后跟`Controller`,例如`CommandLineController`,`IndexController`。
## 1.4.2 創建第一個控制器
### 1.4.2.1 實例
例如我有一個`Home`應用,其中有一個名為`IndexController`的控制器,此控制器有一個`index`方法,返回`Home/Index`模板的內容。
文件名:`/App/Home/IndexController.class.php`。
```php
<?php
/**
* A Demo Controller.
*
* @author xtl<xtl@xtlsoft.top>
* @license MIT
*
*/
namespace Controller\Home;
class IndexController extends \X\Controller {
/**
* Index Method
*
* @param \X\Request $req
*
* @return \X\Response
*
*/
public function index(\X\Request $req) {
return $this->view("Home/Index");
}
}
```
### 1.4.2.2 詳解
一個控制器就是一個類,并且一個控制器文件只允許包含一個對應的控制器類:例如在`\App\Home\FooBarController.class.php`中只能包含`Controller\Home\FooBarController`,而不能包含`Controller\Home\BarBazController`。
每個控制器文件開頭要用`namespace`申明命名空間,格式:`Controller\應用名`。
每個控制器類名就是控制器名,而且需要繼承(`extends`)控制器基類:`\X\Controller`,否則不僅無法使用`view`,`response`等已封裝的方法,而且也無法作為標準容器類進行實例化。
每個控制器方法的屬性必須為`public`,有且只有一個參數,該參數會傳遞`\X\Request`的實例,包括訪問的信息,例如Post Data等等。
每個控制器方法的返回值必須是`\X\Response`的實例,可以通過`$this->response()`,`$this->view()`,`$this->json()`等方法快速實例化。