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。

评论:

  1. 暂无评论...
  2. 我来说两句:

      切换  

    磨途歌检测发现,您当前使用的浏览器版本过低,要想使用画板模式,请先更新浏览器

      切换  

    磨途歌随机验证码