ThinkPHP アプリケーション モデル拡張の謎
ThinkPHP アプリケーション モデルは、コア フレームワークを変換する機会を提供し、アプリケーションがより多くの環境やさまざまなニーズに適応できるようにします。各アプリケーション モードには独自のモード定義ファイルがあり、ThinkPHP3.1 バージョンと比較して、ThinkPHP3.2 バージョンでは、Cli、Lite、Thin、AMF のアプリケーション モードがより明確に拡張されています。 PHPRPC は、REST モードで定義されていますが、その定義方法は ThinkPHP 3.2 バージョンと同様であり、必要に応じて ThinkPHP フレームワークに Cli モードが組み込まれているので、Cli モードを定義しなくても使用できます。より詳細な調整が必要な場合は、「3.1 Cl 実行モード拡張」を参照してください。 ThinkPHP は、開発環境と正式環境の間で便利なモード切り替え方法も提供します。 ThinkPHP の実行プロセスを追跡して、そのアプリケーション モード拡張の謎を分析してみましょう。
1. アプリケーションモードの使い方
アプリケーションモードの拡張機能を学ぶ前に、アプリケーションモードの使い方を見てみましょう。一般に、定数 APP_MODE はエントリ ファイル内でアプリケーション モード名として定義されますが、ThinkPHP フレームワーク エントリ ファイルを分析すると、フレームワークのデフォルト モードは共通モード (common) であり、sae 環境を自動的に識別できることがわかりました。もちろん、APP_MODE 定数が定義されていないことが前提です。もちろん、ThinkPHP は CLI モードと CGI モードを自動的に識別でき、CLI 環境と CGI 環境で実行する場合、ThinkPHP フレームワークはデフォルトでこれら 2 つの環境を自動的に微妙に調整します。もちろん、これら 2 つのアプリケーション モードを自分で拡張することもできます。
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 }
2. アプリケーション モード定義
ThinkPHP フレームワークの入り口に加えて、これを除いて、基本的に他のすべての機能はアプリケーション モードを通じて変更および拡張できます。アプリケーション モードを追加したい場合は、ThinkPHPMode ディレクトリの下にモード定義ファイルを定義するだけで済みます。コモンモード。
//文件路径: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 のアプリケーション モード拡張機能について少し理解しました。それは知っていますが、その理由はわかりません。ロード ファイルのリストと構成を定義すると、フレームワークのコアがどのように変更されるのでしょうか?秘密は ThinkPHPK ブート クラスにあります。以下を確認してみましょう。
//判断是否存在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() のこのコードを通じて、完全にシームレスなパターン定義ファイルの意味と実装を説明します。方法。
3. 単純な実行モードを定義します。
マニュアルにモード拡張の例があります。まず、簡単な実行モードを定義します。 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 で core ファイルが見つかりました。 もちろん、これらの置き換えが必要なプログラム関数は自分で実装する必要がありますが、通常モードで定義されている core ファイルを直接コピーして修正することをお勧めします。彼ら。次に、ThinkPHP アプリケーション開発で次のコア クラス ライブラリ拡張ファイル App.class.php
を実装します。ThinkPHP/Mode ディレクトリに 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 定数を定義する必要があります。正確を期すために、すべてのファイルで MODE_NAME を検索するしかありませんでした。 ThinkPHP フレームワークのファイルが見つからなかったときは安心しました。これは、以前のバージョン 3.1 での動作モードの定義方法です。マニュアルは詳細に更新されています (現在使用しているマニュアルは 2014 年 2 月 14 日のバージョン 3.2.1 であることを明記しておきます)。