实际上要自己实现一个MVC的应用也不难,我们知道MVC里面所有内容都必须经过控制器,所以如何把控制权交给控制器呢?
我们需要一个入口文件,入口文件负责将传递的请求交给对应的控制器,实际上也就是完成路由的功能。
为了学习的需要,可以将路由的功能简化,用户通过GET方式将控制器的名和Action的名传递过来,入口文件接收到所有参数之后,按照之前约定的规则include某一个文件,然后实例化这个类,再调用这个类的相应方法。
| 01 |
| 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 |
| 2 | class IndexModel { |
| 3 | public function test() { |
| 4 | return 'Hello world!'; |
| 5 | } |
| 6 | } |
作为演示,我们只是在这个模型里面返回一个Hello World,那么控制器怎么使用这个模型呢,实际上也就是首先include这个文件,然后实例化类,调用相应的方法。
我们现在修改控制器为:
| 01 |
| 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 |
| 2 |
| 3 |
| 4 |
| 5 |
网趣网上购物系统旗舰版
下载
网趣网上购物系统支持PC电脑版+手机版+APP,数据一站式更新,支持微信支付与支付宝支付接口,是专业的网上商城系统,网趣商城系统支持淘宝数据包导入,实现与淘宝同步更新!支持上传图片水印设置、图片批量上传功能,同时支持订单二次编辑以及多级分类隐藏等实用功能,新版增加商品大图浏览与列表显示功能,使分类浏览更方便,支持最新的支付宝即时到帐接口。 |
| 6 |
| 7 |
写完视图之后,怎么通过控制器调用这个视图呢?
修改控制器至如下:
| 01 |
| 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 | } |
这样一个MVC的应用就搭起来了,虽然比较简陋,问题还多多!!!











