一步步编写PHP的Framework(二)

  实际上要自己实现一个MVC的应用也不难,我们知道MVC里面所有内容都必须经过控制器,所以如何把控制权交给控制器呢?

       我们需要一个入口文件,入口文件负责将传递的请求交给对应的控制器,实际上也就是完成路由的功能。

       为了学习的需要,可以将路由的功能简化,用户通过GET方式将控制器的名和Action的名传递过来,入口文件接收到所有参数之后,按照之前约定的规则include某一个文件,然后实例化这个类,再调用这个类的相应方法。

01	<?php
02	$controller = empty($_GET['c']) ? 'Index' : trim($_GET['c']); //设置了默认的控制器
03	$action = empty($_GET['a']) ? 'index' : trim($_GET['a']); //设置了默认的Action
04	$controllerBasePath = dirname(__FILE__) . '/modules/controllers/';
05	$controllerFilePath = $controllerBasePath . $controller . 'Controller.php';
06	if(is_file($controllerFilePath)) {
07	    include $controllerFilePath;
08	    $controllerName = $controller . 'Controller';
09	    if(class_exists($controllerName)) {
10	        $controllerHandler = new $controllerName();
11	        if(method_exists($controllerHandler,$action)) {
12	            $controllerHandler->$action();
13	        } else {
14	            echo 'the method does not exists';
15	        }
16	    } else {
17	        echo 'the class does not exists';
18	    }
19	} else {
20	    echo 'controller not exists';
21	}

 

 

        看着代码行数还是挺多的哦,实际上实现的功能比较简单,就是通过接受通过GET方式传递的控制器名和Action名,如果没有传递,那么调用默认的控制器名或者Action名,当用户传递了控制器名和Action名之后可能会存在这样一个问题,就是通过我们之前约定的规则找不到相应的文件或者类或者方法,那么我们需要显示友好的信息,而不是让PHP抛出一系列的警告,这样对于程序的健壮性很有帮助。

         当有了控制器之后,一切都变得简单了,对于模型,我们可以把它看成是一个普通的类,只是在功能上它负责业务逻辑的处理。

1	<?php
2	class IndexModel {
3	    public function test() {
4	        return 'Hello world!';
5	    }
6	}

        作为演示,我们只是在这个模型里面返回一个Hello World,那么控制器怎么使用这个模型呢,实际上也就是首先include这个文件,然后实例化类,调用相应的方法。

         我们现在修改控制器为:

01	<?php
02	class IndexController {
03	    public function index() {
04	        $modelPath = dirname(__FILE__) . '/../models/IndexModel.php';
05	        if(file_exists($modelPath)) {
06	            include $modelPath;
07	            $model = new IndexModel();
08	            echo $model->test();
09	        } else {
10	            echo 'model does not exists';
11	        }
12	    }
13	}

   现在模型有了,那么怎么连接视图呢?

1	<html>
2	    <head>
3	    </head>
4	    <body>
5	        <p><?php if(isset($var1)) {echo $var1; } ?></p>
6	    </body>
7	</html>

 

 

        写完视图之后,怎么通过控制器调用这个视图呢?

        修改控制器至如下:

01<?php
02	class IndexController {
03	    public function index() {
04	        $modelPath = dirname(__FILE__) . '/../models/IndexModel.php';
05	        if(file_exists($modelPath)) {
06	            include $modelPath;
07	            $model = new IndexModel();
08	            $var1 =  $model->test();
09	            $viewPath = dirname(__FILE__) . '/../views/index.php';
10	            if(file_exists($viewPath)) {
11	                include $viewPath;
12	            } else {
13	                echo 'view does not exists';
14	            }
15	        } else {
16	            echo 'model does not exists';
17	        }
18	    }
19	}

 

 

转载于:https://my.oschina.net/hjchhx/blog/719168

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值