mPHP核心框架——控制器的代码实现
[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/95/ ]
这一篇文章主要介绍控制器类controller的初始化与加载处理方法的实现代码,并用简单的例子来进行说明.有什么问题可以随时留言.
这一篇文章主要介绍控制器类controller的初始化与加载处理方法的实现代码,并用简单的例子来进行说明。有什么问题可以随时留言。
/*
作者:moyancheng
创建时间:2012-03-01
最后更新时间:2014-01-11
*/
class controller {
public static $view = 0;
public static $register = array();
public $service = 0;
public function __construct() {
if(!self::$view) self::$view = new view();
$service = get_class($this);
if( empty(self::$register[$service]) && ( $service != 'controller' ) ) {
//可以在这里加上权限判断处理
$service = str_replace('Controller','',$service);
$service = "{$service}Service";
self::$register[$service] = new $service;
}
if( $service != 'controller' ) {
$this->service = self::$register[$service];
}
}
public function load() {
if( isset($_GET['c']) ) $controller = "{$_GET['c']}Controller";
elseif( isset($_POST['c']) ) $controller = "{$_POST['c']}Controller";
else $controller = 'indexController';
if( isset($_GET['a']) ) $action = "{$_GET['a']}Action";
elseif( isset($_POST['a']) ) $action = "{$_POST['a']}Action";
else $action = 'indexAction';
if( method_exists($controller,$action) ) {
$controller = new $controller;
call_user_func(array($controller,$action));
} else {
echo '对不起,此页面暂不开放';
exit;
}
}
}controller的构造函数一开始就先实例化了视图类view,这为之后的渲染提供了方便,视图类下一篇文章再做介绍,所以这里暂且先放一放。
然后看看get_class()函数,这个函数配合$this就能返回当前控制器的类名,然后通过一系列的处理,确保正常的实例化相关控制器的逻辑处理服务类service(忽略controller控制器)。
最后,当控制器调用load方法,就会根据$_GET或$_POST传递过来的c、a值进行处理,然后通过call_user_func方法调用对应的类中的方法。
用个简单的例子说明一下,假设通过http://localhost/xxx/?c=index&a=index访问
class indexController extends controller {
public function __construct() {
parent::__construct();
}
public function indexAction() {
echo 'indexAction is ok';
}
}
class indexService {}//先为空,下一篇再讲解逻辑处理服务类1:controller先执行了一遍构造函__construct(),但是因为get_class($this)返回的值为controller,所以跳过服务类的实例化处理。
2:然后行控制器的load方法
$controller = new $controller; call_user_func(array($controller,$action));
等效于下边的代码
$controller = new IndexController; $controller->indexAction();//输出indexAction is ok
3:indexController初始化的过程中通过get_class($this)获取的返回值为indexController,然后实例化了逻辑处理服务类indexService。

我来说两句: