国产InitPHP框架系列 - InitPHP框架搭建高可用WEB应用02:深入控制器应用

原创 2013年12月15日 17:23:18

InitPHP框架是一款轻量级PHP开源框架,框架文档和下载地址:http://initphp.com


控制器Controller基本使用

1. 配置参数

我们在上一节的时候,已经看到过配置信息。控制器的配置参数非常简单,看下面代码(注释中应该讲解的很详细了):

/*********************************Controller配置*****************************************/
/**
 * Controller控制器配置参数
 * 1. 你可以配置控制器默认的文件夹,默认的后缀,Action默认后缀,默认执行的Action和Controller
 * 2. 一般情况下,你可以不需要修改该配置参数
 * 3. $InitPHP_conf['ismodule']参数,当你的项目比较大的时候,可以选用module方式,
 * 开启module后,你的URL种需要带m的参数,原始:index.php?c=index&a=run, 加module:
 * index.php?m=user&c=index&a=run , module就是$InitPHP_conf['controller']['path']目录下的
 * 一个文件夹名称,请用小写文件夹名称
 */
$InitPHP_conf['ismodule'] = false; //开启module方式
$InitPHP_conf['controller']['path']                  = 'web/controller/'; //控制器存放的文件夹目录
$InitPHP_conf['controller']['controller_postfix']    = 'Controller'; //控制器文件后缀名
$InitPHP_conf['controller']['action_postfix']        = ''; //Action函数名称后缀
$InitPHP_conf['controller']['default_controller']    = 'index'; //默认执行的控制器名称
$InitPHP_conf['controller']['default_action']        = 'run'; //默认执行的Action函数
$InitPHP_conf['controller']['module_list']           = array('test', 'index'); //module白名单
$InitPHP_conf['controller']['default_module']        = 'index'; //默认执行module
$InitPHP_conf['controller']['default_before_action'] = 'before'; //默认前置的ACTION名称
$InitPHP_conf['controller']['default_after_action']  = 'after'; //默认后置ACTION名称

2. 创建一个控制器

我们创建一个indexController.php,indexController.php会放在web/controller。注意类名和文件名需要保持一致。

控制器必须继承框架内置的控制器基类Controller。

<?php
/**
 * 入口Controller
 * @author zhuli
 *
 */
class indexController extends Controller {
	
	public $initphp_list = array("get"); //Action白名单
	
	/**
	 * 入口
	 */
	public function run() {
		echo "HELLO WORLD";
	}
	
	/**
	 * get方法
	 */
	public function get() {
		echo "THIS IS GET";
	}
}

3. URL中访问

上面的indexController中,我们可以通过URL访问:

http://127.0.0.1/test/www/index.php?c=index&a=run 会调用run方法。

http://127.0.0.1/test/www/index.php?c=index&a=get 会调用get方法。

因为index和run我们分别设置成了默认的default_controller和default_action,所以http://127.0.0.1/test/www/index.php也会调用run方法。



4. Action白名单

我们可以看到上面的indeController类中有一个$initphp_list变量,这个变量是一个数组,参数就是对外可以访问的URL中的a参数的值。

Controller中需要对外访问的Action都需要加到白名单中,默认的Action run方法除外。

public $initphp_list = array("get"); //Action白名单

5. 新增一个Controller

我们新增一个testController.php


<?php
/**
 * testController
 * @author zhuli.zhul
 *
 */
class testController extends Controller {
	
	public $initphp_list = array("get"); //Action白名单
	
	/**
	 * 入口
	 */
	public function run() {
		echo "TEST RUN";
	}
	
	/**
	 * get方法
	 */
	public function get() {
		echo "TEST GET";
	}
}

对外访问:

http://127.0.0.1/test/www/index.php?c=test&a=run

http://127.0.0.1/test/www/index.php?c=test&a=get

从上面的访问可以看出,URL的c参数对应Controller的名称(除去后缀名称);URL中的a参数对应Controller中可以访问的函数名称。

6. Before和After方法

配置中$InitPHP_conf['controller']['default_before_action']和$InitPHP_conf['controller']['default_after_action']主要设置前置和后置Action。

看一个例子:

<?php
/**
 * 入口Controller
 * @author zhuli.zhul
 *
 */
class indexController extends Controller {
	
	public $initphp_list = array("get"); //Action白名单
	
	public function before() {
		echo "before<br/>";
	}
	
	public function after() {
		echo "after<br/>";
	}
	
	/**
	 * 入口
	 */
	public function run() {
		//返回JSON格式,一般做API使用
		return $this->controller->ajax_return(200, "SUCCESS", array("uid" => 10), 'json');
	}
	
	/**
	 * get方法
	 */
	public function get() {
		echo "THIS IS GET";
	}
}

before方法会在run或者get方法调用之前调用。一般可以做权限操作。
after方法会在run或者get方法调用之后调用。一般可以做日志等后置的操作。

调用:http://127.0.0.1/test/www/index.php?c=index&a=get返回结果:


7. 使用InitPHP中自带的Controller API

因为我们的控制器都会继承InitPHP框架中的Controller基类,所以可以调用框架中的API。如果你没有继承基类,则无法调用。

接口文档可以参考:http://initphp.com中的

控制器中的API,统一使用$this->controller-> 方式调用。

列几个常用的用法:

1. 获取GET|POST常用的参数

	/**
	 * 入口
	 */
	public function run() {
		$uid = (int) $this->controller->get_gp("uid"); //获取GET|POST参数
		echo "HELLO WORLD UID:" + $uid;
	}

2. 跳转页面
	/**
	 * 入口
	 */
	public function run() {
                //10秒后跳转
		$this->controller->redirect("http://www.initphp.com", 10);
	}

3. 返回JSON结构数据

	/**
	 * 入口
	 */
	public function run() {
		//返回JSON格式,一般做API使用
		return $this->controller->ajax_return(200, "SUCCESS", array("uid" => 10), 'json');
	}

控制器分组

1. 为什么要分组?

我们的控制器在URL中访问现在是这样的层次结构index.php?c=xxx&a=xxx。我们只有两层的层次。加入业务比较庞大或者项目比较大,所有的控制器文件都放置在web/controller/文件夹中,会变得非常臃肿。下面是项目结构图:

那么面对项目比较大的情况我们怎么办呢?一个很简单的办法,就是开启控制器分组。

开启控制器分组功能后,URL中访问的方式是:http://127.0.0.1/index.php?m=user&c=index&a=run


2. 配置设置

先看conf.php的配置设置

/**
 * Controller控制器配置参数
 * 1. 你可以配置控制器默认的文件夹,默认的后缀,Action默认后缀,默认执行的Action和Controller
 * 2. 一般情况下,你可以不需要修改该配置参数
 * 3. $InitPHP_conf['ismodule']参数,当你的项目比较大的时候,可以选用module方式,
 * 开启module后,你的URL种需要带m的参数,原始:index.php?c=index&a=run, 加module:
 * index.php?m=user&c=index&a=run , module就是$InitPHP_conf['controller']['path']目录下的
 * 一个文件夹名称,请用小写文件夹名称
 */
$InitPHP_conf['ismodule'] = true; //开启module方式
$InitPHP_conf['controller']['path']                  = 'web/controller/'; //控制器存放的文件夹目录
$InitPHP_conf['controller']['controller_postfix']    = 'Controller'; //控制器文件后缀名
$InitPHP_conf['controller']['action_postfix']        = ''; //Action函数名称后缀
$InitPHP_conf['controller']['default_controller']    = 'index'; //默认执行的控制器名称
$InitPHP_conf['controller']['default_action']        = 'run'; //默认执行的Action函数
$InitPHP_conf['controller']['module_list']           = array('user', 'api'); //module白名单
$InitPHP_conf['controller']['default_module']        = 'api'; //默认执行module
$InitPHP_conf['controller']['default_before_action'] = 'before'; //默认前置的ACTION名称
$InitPHP_conf['controller']['default_after_action']  = 'after'; //默认后置ACTION名称

开启分组,首先我们要将$InitPHP_conf['ismodule']设置为true

为了安全,我们需要对分组的文件夹名称进行白名单维护,所以要配置$InitPHP_conf['controller']['module_list']

同时也要设置默认的分组名称,$InitPHP_conf['controller']['default_module']

3. 创建一个分组示例

我们需要创建user和api两个模块,则在web/controller/文件夹下创建user和api文件夹。

访问API模块:http://127.0.0.1/test/www/?m=api&c=index&a=get

访问USER模块:http://127.0.0.1/test/www/?m=user&c=test&a=get

所以开启控制器分组后,m相当于模块文件夹名称,c相当于控制器名称,a相当于控制器中的Action名称


控制器Controller API实现详解

1. 控制器基类Controller

我们上面讲到了控制器API的调用。这里我们会详细介绍控制器API的实现。

首先我们打开library/initphp/initphp.php文件中的Controller基类。

/**
 * 控制器Controller基类
 * 1. 每个控制器都需要继承这个基类
 * 2. 通过继承这个基类,就可以直接调用框架中的方法
 * 3. 控制器中可以直接调用$this->contorller 和 $this->view
 * @author zhuli
 */
class Controller extends coreInit {

	/**
	 * @var controllerInit
	 */
	protected $controller;

	/**
	 * @var viewInit
	 */
	protected $view;

	/**
	 * 初始化 
	 */
	public function __construct() {
		parent::__construct();
		$InitPHP_conf = InitPHP::getConfig();
		$this->controller = $this->load('controller', 'c'); //导入Controller
		$this->view       = $this->load('view', 'v'); //导入View
		$this->view->set_template_config($InitPHP_conf['template']); //设置模板
		$this->view->assign('init_token', $this->controller->get_token()); //全局输出init_token标记
		//注册全局变量,这样在Service和Dao中通过$this->common也能调用Controller中的类
		$this->register_global('common', $this->controller); 
	}
}

我们从上面的类中,可以看到这个基类中,实际上实现了$controller和$view这两个变量。这两个变量主要通过$this->load这个方法实现controller.init.php对象单例。$view是模板引擎的对象,会在下一节讲。

$this->load是一个工厂函数,在coreInit.php。InitPHP框架中大部分类都通过这个方法进行实例化。







版权声明:本文为博主原创文章,未经博主允许不得转载。

国产InitPHP框架系列 - InitPHP3.8 发布

InitPHP框架已经不知不觉写了三年了。发现今年自己也是蛮拼的,发了四次版本,框架也是越来越完善了。 做PHP框架的门槛其实不高,但是要去想透里面的每一个细节还是需要花很多心思的。 最近两年虽然一直...
  • initphp
  • initphp
  • 2014年11月25日 16:55
  • 5040

国产InitPHP框架系列 - InitPHP框架搭建高可用WEB应用05:数据层Dao使用

InitPHP框架是一款轻量级PHP开源框架,框架文档和下载地址:http://initphp.com Dao层说明 Dao层通俗的讲就是数据层。再简单的讲,Dao层主要是用于写sql语句的。可能...
  • initphp
  • initphp
  • 2014年11月29日 09:39
  • 4826

国产InitPHP框架系列 - InitPHP框架搭建高可用WEB应用03:模板View使用

InitPHP框架是一款轻量级PHP开源框架,框架文档和下载地址:http://initphp.com 模板基本使用 1. 模板配置 我们继续之前几篇文章的代码设计。这一节主要讲如何来使用Ini...
  • initphp
  • initphp
  • 2013年12月29日 14:25
  • 6048

国产InitPHP框架系列 - InitPHP框架搭建高可用WEB应用01:创建项目

InitPHP框架是一款轻量级PHP开源框架,框架文档和下载地址:http://initphp.com 创建Hello World项目 1. 下载框架 选择最新的版本,进行下载。框架下载地址:h...
  • initphp
  • initphp
  • 2013年12月15日 15:23
  • 9242

InitPHP框架Hook机制解读

wordpress受到大部分人的追捧是因为它有一个强大的挂件机制,这个机制可以让全世界各地不同的开发者参与进来,并且不影响原有核心程序代码。 今天来分析下,initphp框架中对hook的处理: ...

initphp框架

  • 2013年06月18日 10:29
  • 445KB
  • 下载

Web应用——驾培管理系统之框架搭建

前言:        本次项目写一个驾驶员培训管理系统的web后端,前端App端由其他人完成。本次项目暂时没有用到struts2+mybatis+spring3框架,只是用最基础的页面交互获取数...

Web应用——驾培管理系统之框架搭建(作者:小圣)

Web应用——驾培管理系统之框架搭建 前言:本次项目笔者写一个驾驶员培训管理系统的web后端,前端App端由其他人完成。本次项目暂时没有用到struts2+mybatis+spring3框架,...

InitPHP轻量级开源框架

  • 2012年05月19日 20:50
  • 380KB
  • 下载

InitPHP开源框架load函数分析

InitPHP开源框架整个框架都是一个巨大的类库,通过一个load函数,实现了框架与外界框架运行和应用程序使用框架接口的通道。   $this->load() 函数存放在core/core.ini...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:国产InitPHP框架系列 - InitPHP框架搭建高可用WEB应用02:深入控制器应用
举报原因:
原因补充:

(最多只允许输入30个字)