Big Bug Ban

兴趣 践行 创新

Archive for the ‘php框架技术与MVC’ tag

MVC in php — 控制器(Controller)

 

控制器,有的地方又称之为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
 
比如以下的例子
 

<?php

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%的框架都需要让你继承它的基类。
 
比如获取参数,涉及到安全性,在框架层面就可以容易封装。
 
 
 
 
 

Written by princehaku

8月 3rd, 2012 at 6:29 下午