欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

MVC in php

程序员文章站 2022-04-26 18:52:17
...

控制器,有的地方又称之为Action。 它是MVC中的C,控制视图展现 它会担负很多任务。要接受请求,要选择M处理,最后选择V来显示。 一般在php中大多数情况下他都作为业务的处理层了。 比如对传入参数进行处理,对显示元素进行组装。 它的实现一般也两类 通过对

控制器,有的地方又称之为Action。

它是MVC中的C,控制视图展现

它会担负很多任务。要接受请求,要选择M处理,最后选择V来显示。
 
一般在php中大多数情况下他都作为业务的处理层了。
 
比如对传入参数进行处理,对显示元素进行组装。
 
它的实现一般也两类
 
通过对象的映射或者是通过文件包含的形式
 
最简单当然就是通过文件包含的形式。
 
比如访问index.php/aa/bb/cc
 
可以让程序加载aa目录下的bb文件
 
然后之后的作为参数注入,这个过程在路由模块中实现
 
另外的一种就是通过类的方式
 
一般说来以类方式实现的控制器大致会长成这样
 

php

class IndexController extends CController{

    public function sae() {
        echo 'Hello';    
    }

}
 
现在有一个请求index.php/index/sae
 
怎样路由到它上面呢?
 
方法也是多种多样的~ 
 
首先我可以从url上得到参数
 
$action = 'index';
 
$method = 'sae';
 
然后通过$ac = new $action();
 
可以得到一个新的IndexController实例
 
然后再调用$ac->$method();
 
就阔以了。
 
另外的方式就是通过反射来实现。
 
以上两种方式都会出现一个问题,如果我即将包含的这个文件IndexController.php中包含错误
 
或者是在sae() (执行过程中) 出现了错误被终止。我怎样去捕获它呢?
 
在php的oop中,exception的处理并没有java那样严格。不会强制要求throws Exception
 
比如以下的例子
 

class a {

public function expt() {
throw new Exception('wa!');
}
}

class c {

public function combinea() {
$a = new a();
$a->expt();
}
}

$c = new c();
$c->combinea();

它会抛出一个Fatal error: Uncaught exception 'Exception'
 
但是在php5.2的某些版本,他什么都不会输出,而且你也不能用try catch来捕获$c->combinea()抛出的异常。
 
最怕的不是出错,而是出了错什么都没有记录。增加了你debug的难度。
 
然后是另外一个问题~
 
如果我想要访问的地址是
 
index.php/index/list
 
php 
    class IndexController extends CController{ 
        public function list() { 
            echo 'Hello'; 
        } 
    }
注意!  list这个词是php的预留词,所以这个文件语法有问题,包含的时候就会报错。
 
一些框架的解决方案是方法前统一加个词 比如action
 
控制器大致是这样的
 
php 
    class IndexController extends CController{ 
        public function actionlist() { 
            echo 'Hello'; 
        } 
    }
 
Controller也会需要参数的获取,模型载入,库载入等等工作。
 
所以框架对这层进行封装,这些工作会在基类CController上实现。
 
这也是为什么90%的框架都需要让你继承它的基类。
 
比如获取参数,涉及到安全性,在框架层面就可以容易封装。