用户定义的控制器和视图是根据实际项目的需求,所以理解起来更明白些。
根据约定,这些文件必须存放在app目录 下
<?php
namespace app\controllers;
use fastphp\base\Controller;
class IndexController extends Controller
{
public function index(){
echo '测试';
}
public function show(){
echo 'hello mvc';
}
}
我们定义的Index控制器类必须遵循我们定义的规范:首字母大写,必须以Controller结尾。那么这些规范是在哪儿定义的呢?
我们就要返回到fastphp.php文件,在路由处理函数route() 中,有这样一行代码:
$controller = 'app\\controllers\\' . ucfirst($controllerName) . 'Controller';
你会发现,ucfirst() 就是要把路由中的index 转换成 Index,然后再连接上Controller。
比如:你请求的是:http://127.0.0.1/mvc/public/index.php/index/show
根据我们写的程序:控制器类应该是 app\controllers\IndexController,其中 app\controlle 是命名空间,IndexController是控制器名称 。
所以我们定义的控制器,命名空间为:app\controllers
因为要继承核心的控制器,所以也要把核心的控制器类也要引入进来
我们写了两个方法:index() 和show()方法,都很简单。
下面我们测试一下
我们做了四组测试,请求的url是不一样的。
第一组测试:在url中我们没有给定控制器和方法,那么根据fastphp.php约定的,就会使用配置文件config指定的默认的的控制器,方法名也是这样的
第二组测试:在url中我们给出了控制器index,没有给出方法,根据约定,就会使用配置文件config指定的默认的方法名
第三组测试:在url 中我们给出了控制器index ,方法名index ,所以程序就会执行indexController控制器中的index方法
第四组测试:在url中我们给出了控制器Index,方法名 show,所以程序就会执行indexController 控制器中的show方法
在上面的控制器中,我们没有使用视图,接下来我们创建视图文件:index.php和show.php
这两个文件一定要放在app\views中的index目录下,其中 index是根据控制器名称创建的目录
index.php和show.php是根据控制器 index中的方法名index() 和show()方法定义的。
index.php文件参考代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
欢迎使用mvc
</body>
</html>
show.php文件参考代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<ul>
<li><?php echo $no; ?></li>
<li><?php echo $name; ?></li>
</ul>
</body>
</html>
我们把控制器的代码改成了如下样子:
<?php
namespace app\controllers;
use fastphp\base\Controller;
class IndexController extends Controller
{
public function index(){
$this->render();
}
public function show($no,$name){
$this->assign('no',$no);
$this->assign('name',$name);
$this->render();
}
}
在index方法中,我们使用了 $this->reader() 方法,它会自动 加载 index,php 模板文件
在show方法,有两个参数:$no, $name ,我们使用了
$this->assign('no',$no);
$this->assign('name',$name);
表示向模板文件show.php传递了两个值 $no,$name, 在模板中这两个名称 分别是:no 和name
所以在show.php模板中,我们输出了这两个变量。
<li><?php echo $no; ?></li>
<li><?php echo $name; ?></li>
我们请求的url 必须 也要传递两个参数:
有一个问题是:$this->assign('no',$no); 可以改成:$this->assign('number',$no) 吗
总结一下,控制器向视图传递数据,视图负责显示数据。用户定义的控制器必须继承核 心的控制器。