php如何应用扩展,ThinkPHP应用模式扩展详解

ThinkPHP的应用模式使得开发人员对核心框架进行改造较以往更为得心应手,并且可以让你的应用适应更多的环境和不同的需求。每个应用模式都有自己的模式定义文件,相对于ThinkPHP3.1版本,ThinkPHP3.2版本对应用模式的扩展更加明确和清晰,在ThinkPHP3.1版本中定义了Cli、Lite、Thin、AMF、PHPRPC、REST模式,其定义方式和ThinkPHP3.2版本的方式大同小异,如有需要可以参考修改,其中Cli模式被ThinkPHP框架内置,不用单独定义Cli模式即可正常使用,如需要更细化调整可以参考3.1版编写的Cli运行模式扩展。ThinkPHP同样提供了便捷的开发环境和正式环境的模式切换方式。让我们随着ThinkPHP的运行流程解析其应用模式扩展之谜。

一、应用模式的使用

在研究应用模式扩展之前,看看如何使用应用模式的吧。一般通过在入口文件定义常量APP_MODE为应用模式名称,但是在分析ThinkPHP框架入口文件时,了解到框架默认采用模式为普通模式(common),而且可以自动识别sae环境,当然前提是没有定义APP_MODE常量时,当然ThinkPHP可以自动识别CLI和CGI模式,并且在CLI和CGI环境下运行ThinkPHP框架在默认模式中自动对这两种环境做了细微调整,当然也可以自己扩展这两种应用模式。

if(function_exists('saeAutoLoader')){// 自动识别SAE环境

defined('APP_MODE') or define('APP_MODE', 'sae');

defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'Sae');

}else{

defined('APP_MODE') or define('APP_MODE', 'common'); // 应用模式 默认为普通模式

defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'File'); // 存储类型 默认为File

}

二、应用模式定义

在ThinkPHP框架当中除了ThinkPHP框架入口和框架引导类以外,基本所有其他功能都可以通过应用模式进行更改和扩展,如果我们要增加一个应用模式,只需要在ThinkPHP\Mode目录下面定义一个模式定义文件即可,我们可以通过分析common模式进行学习。该文件的代码如下:

//文件路径:ThinkPHP/Mode/common.php

/**

* ThinkPHP 普通模式定义

* 定义一个模式文件,只需要返回一个模式包含文件的数组即可

* 在数组中主要包含4种扩展文件列表:

* config 为默认加载配置文件列表

* alias 为核心类库别名配置列表

* core 需要加载的核心函数和类文件列表

* tags 行为配置列表

*

* 如果在应用模式定义中加载一个自定类,那个自定义类的命名空间必须是Think

*/

return array(

// 配置文件

'config' => array(

THINK_PATH.'Conf/convention.php', // 系统惯例配置

CONF_PATH.'config.php', // 应用公共配置

),

// 别名定义

'alias' => array(

'Think\Log' => CORE_PATH . 'Log'.EXT,

'Think\Log\Driver\File' => CORE_PATH . 'Log/Driver/File'.EXT,

'Think\Exception' => CORE_PATH . 'Exception'.EXT,

'Think\Model' => CORE_PATH . 'Model'.EXT,

'Think\Db' => CORE_PATH . 'Db'.EXT,

'Think\Template' => CORE_PATH . 'Template'.EXT,

'Think\Cache' => CORE_PATH . 'Cache'.EXT,

'Think\Cache\Driver\File' => CORE_PATH . 'Cache/Driver/File'.EXT,

'Think\Storage' => CORE_PATH . 'Storage'.EXT,

),

// 函数和类文件

'core' => array(

THINK_PATH.'Common/functions.php',

COMMON_PATH.'Common/function.php',

CORE_PATH . 'Hook'.EXT,

CORE_PATH . 'App'.EXT,

CORE_PATH . 'Dispatcher'.EXT,

//CORE_PATH . 'Log'.EXT,

CORE_PATH . 'Route'.EXT,

CORE_PATH . 'Controller'.EXT,

CORE_PATH . 'View'.EXT,

BEHAVIOR_PATH . 'BuildLiteBehavior'.EXT,

BEHAVIOR_PATH . 'ParseTemplateBehavior'.EXT,

BEHAVIOR_PATH . 'ContentReplaceBehavior'.EXT,

),

// 行为扩展定义

'tags' => array(

'app_init' => array(

'Behavior\BuildLiteBehavior', // 生成运行Lite文件

),

'app_begin' => array(

'Behavior\ReadHtmlCacheBehavior', // 读取静态缓存

),

'app_end' => array(

'Behavior\ShowPageTraceBehavior', // 页面Trace显示

),

'view_parse' => array(

'Behavior\ParseTemplateBehavior', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎

),

'template_filter'=> array(

'Behavior\ContentReplaceBehavior', // 模板输出替换

),

'view_filter' => array(

'Behavior\WriteHtmlCacheBehavior', // 写入静态缓存

),

),

);

我们看到这个普通应用模式代码之后,有点明了ThinkPHP的应用模式扩展是怎么回事了,但是还是知其然而不知其所以然,定义一个加载文件列表和配置是如何改变框架核心的呢?秘密就在ThinkPHP引导类中,让我们再回顾以下吧!

//判断是否存在core.php配置文件(这是开发环境临时定义的运行模式,我是这么理解的)

//否者加载APP_MODE定义的模式文件

$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';

//加载模式中core定义的核心文件列表

foreach ($mode['core'] as $file){

if(is_file($file)) {

include $file;

if(!APP_DEBUG) $content .= compile($file);

}

}

//加载模式中定义的config配置文件列表

foreach ($mode['config'] as $key=>$file){

is_numeric($key)?C(include $file):C($key,include $file);

}

// 读取当前应用模式对应的配置文件

if('common' != APP_MODE && is_file(CONF_PATH.'config_'.APP_MODE.'.php'))

C(include CONF_PATH.'config_'.APP_MODE.'.php');

// 加载模式中alias别名列表定义

if(isset($mode['alias'])){

self::addMap(is_array($mode['alias'])?$mode['alias']:include $mode['alias']);

}

// 加载应用别名定义文件

if(is_file(CONF_PATH.'alias.php'))

self::addMap(include CONF_PATH.'alias.php');

// 加载模式中tags行为定义

if(isset($mode['tags'])) {

Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']);

}

// 加载应用行为定义

if(is_file(CONF_PATH.'tags.php'))

// 允许应用增加开发模式配置定义

Hook::import(include CONF_PATH.'tags.php');

// 加载框架底层语言包

L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php');

通过ThinkPHP::start()中的这段代码,完美无缝关联的模式定义文件的意义与实现方法。

三、定义简单的运行模式

手册中有一个模式扩展到的实例,可以拿到这里来分析一下,定义一个lite简洁运行模式,首先在ThinkPHP/Mode目录下新建一个lite.php文件内容定义如下:

return array(

// 配置文件

'config' => array(

THINK_PATH.'Conf/convention.php', // 系统惯例配置

CONF_PATH.'config.php', // 应用公共配置

),

// 别名定义

'alias' => array(

'Think\Exception' => CORE_PATH . 'Exception'.EXT,

'Think\Model' => CORE_PATH . 'Model'.EXT,

'Think\Db' => CORE_PATH . 'Db'.EXT,

'Think\Cache' => CORE_PATH . 'Cache'.EXT,

'Think\Cache\Driver\File' => CORE_PATH . 'Cache/Driver/File'.EXT,

'Think\Storage' => CORE_PATH . 'Storage'.EXT,

),

// 函数和类文件

'core' => array(

MODE_PATH.'Lite/functions.php',

COMMON_PATH.'Common/function.php',

MODE_PATH . 'Lite/App'.EXT,

MODE_PATH . 'Lite/Dispatcher'.EXT,

MODE_PATH . 'Lite/Controller'.EXT,

MODE_PATH . 'Lite/View'.EXT,

CORE_PATH . 'Behavior'.EXT,

),

// 行为扩展定义

'tags' => array(

'view_parse' => array(

'Behavior\ParseTemplate', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎

),

'template_filter'=> array(

'Behavior\ContentReplace', // 模板输出替换

),

),

);

从上面的配置当中我们发现core中的核心文件大多数都被替换了,当然这些需要被替换的程序功能需要我们自己去实现,不过建议大家直接拷贝普通模式中定义的核心文件过来修改。接下来我们来实现以下ThinkPHP应用开发中的核心类库扩展文件App.class.php

在ThinkPHP/Mode目录下建立一个Lite目录并在lite目录下建立App.class.php文件,以下是程序文件的实现:

//模式扩展类库必须是Think命名空间

namespace Think;

/**

* ThinkPHP 应用程序类 执行应用过程管理 Lite模式扩展类

* 实现ThinkPHP核心类库扩展时,尽可能仿造原有类库实现(除非对ThinkPHP框架源码特别了解)

* 因为在其他没有扩展的核心文件中可能会调用扩展的核心类文件中的某个方法,除非你打算全部扩展

*/

class App{

/**

* 应用程序初始化

* @access public

* @return void

*/

static public function init() {

//具体现实

}

/**

* 执行应用程序

* @access public

* @return void

*/

static public function exec() {

//具体实现

}

/**

* 运行应用实例 入口文件使用的快捷方法

* @access public

* @return void

*/

static public function run() {

//具体实现

}

static public function logo(){

//具体实现

}

}

当文件所有扩展文件的实现后,可以在框架入口文件定义APP_MODE常量为lite。

另外需要注意一点,手册当中要求定义的MODE_NAME常量来改变运行模式是之前3.1版本中定义运行模式的方法,使用新版本的用户对此需要注意。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1,SDK简介 本SDK是基于ThinkPHP开发类库扩展,因此只能在ThinkPHP平台下使用(ThinkPHP版本要求2.0以上)。DEMO中用到了控制器分层,因此运行DEMO需使用ThinkPHP3.1.2版本。 2,目前支持的平台 目前可用登录平台为:腾讯QQ,腾讯微博,新浪微博,网易微博,人人网,360,豆瓣,Github,Google,MSN,点点,百度,开心网,搜狐。 3,包含的文件 ThinkSDK/ThinkOauth.class.php SDK基类,主要用于Oauth的认证,所有平台的SDK均需要继承此类 ThinkSDK/sdk/DiandianSDK.class.php (点点SDK) ThinkSDK/sdk/DoubanSDK.class.php (豆瓣SDK) ThinkSDK/sdk/GithubSDK.class.php (Github SDK) ThinkSDK/sdk/GoogleSDK.class.php (Google SDK) ThinkSDK/sdk/MsnSDK.class.php (MSN SDK) ThinkSDK/sdk/QqSDK.class.php (腾讯QQ SDK) ThinkSDK/sdk/RenrenSDK.class.php (人人网SDK) ThinkSDK/sdk/SinaSDK.class.php (新浪微博SDK) ThinkSDK/sdk/T163SDK.class.php (网易微博SDK) ThinkSDK/sdk/TencentSDK.class.php (腾讯微博SDK) ThinkSDK/sdk/X360SDK.class.php (360 SDK) ThinkSDK/sdk/BaiduSDK.class.php (百度SDK) ThinkSDK/sdk/KaixinSDK.class.php (开心网SDK) ThinkSDK/sdk/SohuSDK.class.php (搜狐SDK) 4,配置格式 SDK的配置格式如下(可参考DEMO中的配置) //将一下(TYPE)换成你对应的SDK类型 'THINK_SDK_(TYPE)' => array( 'APP_KEY' => '', //应用注册成功后分配的 APP ID 'APP_SECRET' => '', //应用注册成功后分配的KEY 'CALLBACK' => '', //注册应用填写的callback ) 5,接入登录方法 添加ThinkPHP扩展,将整个ThinkSDK目录放入到ThinkPHP扩展目录下~Extend/Library/ORG/~。 添加SDK配置,按以上配置格式在项目配置中添加对应的SDK配置。(可参考DEMO中的配置文件) 跳转到授权页面,导入SDK基类import("ORG.ThinkSDK.ThinkOauth"),获取SDK实例$sdk=ThinkOauth::getInstance($type),跳转到授权页面redirect($sdk->getRequestCodeURL())。(可参考DEMO中的Index/login方法) 获取access_token,在授权成功的回调页面中,调用$sdk->getAccessToken($code, $extend)方法来获取access_token。(可参考DEMO中的Index/callback方法) 6,调用API方法 成功获取到access_token之后就可以调用相应平台的API了,调用方法比较简单,只需要调用$sdk->call($api, $param, $method)方法就可以了,其中:$api为接口名称,$param为接口参数(格式:name1=value1&name2=value2), $method为请求方法(GET或POST)。 例如: import("ORG.ThinkSDK.ThinkOauth"); //导入SDK基类 $qq = ThinkOauth::getInstance('qq', $token); //实例化腾讯QQ开放平台对象 $token 参数为授权成功后获取到的 $token $data = $qq->call('user/get_user_info'); //调用接口

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值