## 2.4 加载控制器
~~~
1. 新建app项目
2. 新建index控制器index方法
3. 加载控制器
~~~
### 1. 新建app项目
新建 `/app` 文件夹,接着创建 `/app/ctrl` 文件夹存放控制器文件,在控制器文件夹下创建一个 `/app/ctrl/indexCtrl.php` 为什么不直接创建 `index.php` 的原因,是为了防止控制器方法和类名重名。
### 2. 新建index控制器index方法
*D:\wamp\www\web.com\app\ctrl\indexCtrl.php*
~~~
<?php
namespace app\ctrl;
class indexCtrl
{
public function index()
{
p("这是index控制器的index方法");
}
}
~~~
### 3. 加载控制器和方法
上一节,我们通过路由类实现了通过解析URL找到了控制器和对应的方法。那么这一小节,我们来加载对应的控制器和方法。
**定义模块名常量:**
*D:\wamp\www\web.com\index.php*
~~~
define('MODULE', 'app');
~~~
**加载控制器和方法:**
*D:\wamp\www\web.com\core\thinkphp.php*
~~~
static public function run()
{
$route = new \core\lib\route();
// 解析URL获取控制器和方法名
$ctrlClass = $route->ctrl;
$action = $route->action;
$ctrlFile = APP.'/ctrl/'.$ctrlClass.'Ctrl.php';
$ctrlClass = '\\'.MODULE.'\ctrl\\'.$ctrlClass.'Ctrl';
// 判断控制器的类文件是否存在,否则抛出异常
if (is_file($ctrlFile)) {
include $ctrlFile;
// 实例化控制器类
$ctrl = new $ctrlClass();
// 判断控制器中的方法是否存在,否则抛出异常
if (method_exists($ctrl, $action)) {
// 调用控制器中的方法
$ctrl->$action();
} else {
throw new \Exception($ctrlClass."控制器中不存在".$action."方法");
}
} else {
throw new \Exception("找不到控制器".$ctrlClass);
}
}
~~~
> 常见 类/对象 的函数:<http://php.net/manual/zh/ref.classobj.php>
**调整入口文件的运行框架的方法**
*D:\wamp\www\web.com\index.php*
~~~
try {
\core\thinkphp::run();
} catch (\Exception $e) {
echo $e->getMessage();
}
~~~
### 4. 效果
![](https://box.kancloud.cn/8e0466536b313034cd9db33ec9345a69_742x285.png)
![](https://box.kancloud.cn/a8692ae4ca62a5f1185a85664daf8dd0_742x285.png)
![](https://box.kancloud.cn/0dcc2cb88be9b60900d78a56ca4ca85d_742x285.png)