🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[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()`等方法快速实例化。