## 关于控制器(C)
* 一个控制器包含多个操作(方法),操作方法是一个URL访问的最小单元,每一次的URL访问请求实则最终对应的就是这样一个小单元。
* 当用户通过一个固定的入口文件发起请求,最终是分配到控制器里的某一个操作去执行具体的业务处理。因此我们的开发过程主要就是通过不同的控制器去调度不同的业务逻辑,最终将处理后的结果反馈给用户。
* 按请求流程常见的有:用户发起请求页面→预先配置一些处理规则→动态生成表单→填写表单(输入)→数据验证合法后保存至数据库→在需要的时候从数据库查询(输出)→加载模板引擎→通过前端组件展现给浏览器。(以上步骤并非缺一不可)
* 如果您对ThinkPHP的控制器知识不熟悉,包括多级控制器、空控制器、资源控制器、Rest控制器等请浏览TP的[控制器](https://www.kancloud.cn/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;
}
}
~~~