《php面向对象》第33课 封装复杂的MVC-用户定义的控制器和视图

用户定义的控制器和视图是根据实际项目的需求,所以理解起来更明白些。

根据约定,这些文件必须存放在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) 吗

总结一下,控制器向视图传递数据,视图负责显示数据。用户定义的控制器必须继承核 心的控制器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李 书 明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值