[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()`等方法快速实例化。