[TOC]
* * * * *
## 1 控制器基类文件分析(thinkphp/library/think/Controller.php)
~~~
protected $view = null;
protected $beforeActionList = [];
~~~
~~~
public function __construct()
{
$this->view = \think\View::instance(Config::get());
if (method_exists($this, '_initialize')) {
$this->_initialize();
}
if ($this->beforeActionList) {
foreach ($this->beforeActionList as $method => $options) {
is_numeric($method) ?
$this->beforeAction($options) :
$this->beforeAction($method, $options);
}
}
}
~~~
~~~
protected function beforeAction($method, $options = [])
{
if (isset($options['only'])) {
if (is_string($options['only'])) {
$options['only'] = explode(',', $options['only']);
}
if (!in_array(ACTION_NAME, $options['only'])) {
return;
}
} elseif (isset($options['except'])) {
if (is_string($options['except'])) {
$options['except'] = explode(',', $options['except']);
}
if (in_array(ACTION_NAME, $options['except'])) {
return;
}
}
if (method_exists($this, $method)) {
call_user_func([$this, $method]);
}
}
~~~
~~~
public function fetch($template = '', $vars = [], $cache_id = '')
{
return $this->view->fetch($template, $vars, $cache_id);
}
public function show($content, $vars = [])
{
return $this->view->show($content, $vars);
}
public function assign($name, $value = '')
{
$this->view->assign($name, $value);
}
public function engine($engine, $config = [])
{
$this->view->engine($engine, $config);
}
~~~
Controller.php定义了控制的基类操作,大部分是视图的操作调用
`1 public function __construct(){} `
构造函数创建视图对象,并调用控制器实例化方法$this->_initialize(),
最后调用前置操作方法$this->beforeAction()
`2 public function fetch($template = '', $vars = [], $cache_id = ''){}`
`public function show($content, $vars = []){}`
编译模板文件并输出。
`3 public function assign($name, $value = ''){}`
控制器变量传递到模板中
`4 public function engine($engine, $config = []){}`
设置视图的模板渲染引擎
* * * * *
## 2 应用入口分析
应用目录的入口在App::run()的调度类型的module调度中
其分析思路见 [应用启动文件](http://www.kancloud.cn/zmwtp/tp5/119426)与[应用调度分析](http://www.kancloud.cn/zmwtp/tp5/119428)两节。
访问localhost/tp5/public/index.php 时。
根据全局配置文件/thinkphp/convention.php中的配置可知
default_module 默认模块为 index
default_controller 默认控制器 Index,
default_action 默认操作 index,
因此App::run()的module调度类型中会自动访问/applicaiton/index模块
自动加载器的Loader::controller()会自动访问/application/index模块的index控制器。
Index控制器在/applicaiton/index/controller的index.php文件
所以最后调用/application/index/controller/index.php文件的index()。
* * * * *
## 3 应用默认目录(/application/)
~~~
/application
/index
/controller
config.php
databse.php
route.php
~~~
其中/index 应用的index模块
/controller Index模块下的控制器目录
config.php 应用的配置文件
databse.php 应用的数据库配置文件
route.php 应用的路由配置文件
## 4 应用控制器开发
应用控制器是应用调度的入口文件,通常的开发就是在/application/index/controller目录下添加控制器,并调用框架模型和视图等实现业务逻辑。
控制器controller是框架MVC的入口。通常在controller类的方法中调用模型的操作与视图渲染方法。
模型操作见 数据模型文件
视图渲染见 视图渲染文件
其具体开发见 使用范例 [应用控制器操作](http://www.kancloud.cn/zmwtp/tp5/119443)。
进一步的可将前台与后台进行分模块开发。模块开发见 使用范例的[模块开发](http://www.kancloud.cn/zmwtp/tp5/119528)