一步步编写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 }

         这样一个MVC的应用就搭起来了,虽然比较简陋,问题还多多!!!

时间: 2024-12-30 02:46:19

一步步编写PHP的Framework(二)的相关文章

一步步编写PHP的Framework(十二)

          我上次在讲redirect和forward的时候我就说过,这两个函数要正常使用还需要修改一下Route这个类,至少要将比如域名,控制器名,Action名等存储起来,后面调用redirect,forward的时候可以使用.         现在我们就转到Route.php,原来这个类的代码很简单: 01 <?php 02 class Route extends Base { 03    public static function run() { 04       $contr

一步步编写PHP的Framework(一)

        框架这个概念可能一开始就吓坏了很多PHP的Coder,其实你只要把一个Framework想明白了,其实也没啥,只是别人功能更复杂,细节考虑的更多,代码质量更高.        框架最重要的一个文件为入口文件,基本上相当于一个总控开关,所有的请求都需要经过这个文件: 1 <?php 2 define('APP_PATH',dirname(__FILE__).'/..'); //应用路径 3 include APP_PATH.'/Library/Toper/Core/FrontCon

一步步编写PHP的Framework(八)

  既然前端控制器控制一切,那么我们可以用它来做更多的事情!! 我们知道,在windows里面默认php.ini中display_errors默认开启,而在linux中默认是关闭的,那么这样对于程序的调试时很麻烦的,所以我们可以在配置文件中设置一个debug属性,它代表是否调试打开,如果打开调试,程序出现任何异常,那么会输出很多调试信息.在这儿,我只是很简单的设置一下,真正的框架调试功能肯定不是这样简单的. 先我们实现如果debug开启,那么显示调试信息debug mode:这样一个字符串,并且

一步步编写PHP的Framework(九)

         之前讲到过对于异常的处理机制,最好可以自定义异常,如果debug打开,那么显示具体的调试信息,如果debug关闭,那么将异常记录到日志,然后跳转到错误页,这节课我就主要来讲一下这个异常处理机制.        现在我们定义一个异常的基类,在Toper中为Tp_Exception,在这儿,我就直接叫BaseException吧,那BaseException.php肯定首先是有一个架子的: 1 <?php 2 class BaseException extends Exceptio

一步步编写PHP的Framework(十)

  之前讲了这么多,实际上都只是为框架搭建了一个架子而已,框架里面还没有什么东西, 从今天开始,我就开始从Controller,Model,View这几块儿来分别介绍一下. PS:之前的很多内容我都没有细讲,就比如路由,真正的框架路由肯定不是通过GET方式指定的,而是正则,并且它需要兼容多个Server,多种方式. 我们知道所有的请求都需要经过控制器,所以首先还是说一下控制器. 我们之前已经 说过控制器的概念了,但是这个控制器还是功能太弱了,因为它只是从功能上是控制器,框架并没有为它做任何事情,

一步步编写PHP的Framework(十一)

  之前讲了怎么让实现跳转和请求的转发,当然,也只是很简单的说了一下,更深的内容需要你自己去读一下具体框架的实现. 现在跳转和转发有了,对于模型的编写可以后面再来,那我就先说一下怎么讲数据从控制器传递到视图,之前我们的实现方式非常丑陋: 1 $viewPath = dirname(__FILE__) . '/../views/index.php'; 2 if(file_exists($viewPath)) { 3     include $viewPath; 4 } else { 5     e

一步步编写PHP的Framework(十三)

  上次讲到控制器怎么样将数据传递到视图,今天我就主要说一下在程序中怎么让代码更"安全",之后就转到讲模型,再讲怎么做视图,最后再讲控制器的功能强化.       我再声明一下,我写这个文章只是让大家对PHP的框架编写有一个基本的了解,由于本人技术有限,这个文章是给PHP初学者学习的,所以高手勿喷,还有就是我现在时间也有限,所以每次可能需要两三天才能写一篇,每篇我写的时间也要控制在一个小时以内,由于边写这个文章边编代码,所以代码中可能会存在很多BUG,见谅!!        如果你是一

一步步编写PHP的Framework(十四)

   今天我说一下怎么在框架中over掉这些安全问题.       首先是SQL注入,这个如果你使用的是PDO,我觉得应该没什么问题,如果你使用的还是mysql_*等API,那么你可以在框架中实现bindParameter或者在插入数据库之前进行字符串转义.       前两天把上一篇文章写完之后,Vian在后面留言说到过SQL注入的一个解决方案,就是在在插入DB之前进行'''.addslashes($id).''',它的意思就是首先进行addslashes操作,之后再强制单引号包裹,这样它就是

一步步编写PHP的Framework(十五)

  从今天开始我们开始介绍模型,模型是一个框架中非常重要的一块儿,控制器实际上不能进行数据的处理,这种处理的过程我们全部放在模型这一块儿来做.         如果是Java,即使是没用框架,它的模型这一块儿也挺复杂的,首先编写service接口,然后写实现,然后定义DAO接口,DAO实现,然后定义这几层之间传输数据的Domain,一般我认为它就是一个POJO.         Java这种契约式的编程方式很不错,即使后面的实现类发生改变,接口没有改变,代码的修改的量也不是很多.