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。
我来说两句: