> 백엔드 개발 > PHP 튜토리얼 > ThinkPHP 애플리케이션 모드 확장 상세 설명_php 예시

ThinkPHP 애플리케이션 모드 확장 상세 설명_php 예시

WBOY
풀어 주다: 2016-05-16 20:39:46
원래의
1035명이 탐색했습니다.

ThinkPHP의 애플리케이션 모델을 사용하면 개발자가 이전보다 핵심 프레임워크를 더 쉽게 변환할 수 있으며 애플리케이션이 더 많은 환경과 다양한 요구 사항에 적응할 수 있습니다. 각 애플리케이션 모드에는 자체 모드 정의 파일이 있습니다. ThinkPHP3.1 버전과 비교하여 ThinkPHP3.2 버전은 ThinkPHP3.1 버전에서 Cli, Lite, Thin, AMF 및 더 명확하고 명확한 애플리케이션 모드 확장을 갖습니다. PHPRPC가 정의되어 있으며, 그 정의 방법은 ThinkPHP 3.2 버전과 유사합니다. 필요한 경우 Cli 모드가 ThinkPHP 프레임워크에 내장되어 있어 Cli 모드를 정의하지 않고도 정상적으로 사용할 수 있습니다. 별도로 자세한 조정이 필요한 경우 에 작성된 3.1 Cli 실행 모드 확장을 참조하세요. ThinkPHP는 개발 환경과 정형 환경 간의 편리한 모드 전환 방법도 제공합니다. ThinkPHP의 실행 프로세스를 따라가며 응용 프로그램 모드 확장의 미스터리를 분석해 보겠습니다.

1. 애플리케이션 모드 사용

애플리케이션 모드 확장을 살펴보기 전에 애플리케이션 모드 사용 방법을 살펴보겠습니다. 일반적으로 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  
}

로그인 후 복사

2. 애플리케이션 모드 정의

ThinkPHP 프레임워크에서는 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의 애플리케이션 모드 확장이 무엇인지 어느 정도 이해했지만 여전히 알고 있었지만 로드된 파일 목록 및 구성을 정의하면 확장의 핵심이 어떻게 바뀌는지 알지 못했습니다. 뼈대? 그 비밀은 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()의 이 코드를 통해 패턴 정의 파일의 의미와 구현 방법이 완벽하고 매끄럽게 연결됩니다.

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', // 模板输出替换
        ),
 ),
);

로그인 후 복사

위 구성에서 코어에 있는 대부분의 코어 파일이 교체되었음을 확인했습니다. 물론 이러한 교체가 필요한 프로그램 기능은 직접 구현해야 하지만 직접 복사하는 것이 좋습니다. 일반 모드에서 정의한 코어 파일을 수정합니다. 다음으로 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(){
    //具体实现
}
}
로그인 후 복사

해당 파일의 확장 파일을 모두 구현한 후 프레임워크 항목 파일에 lite로 APP_MODE 상수를 정의할 수 있습니다.

또 한 가지 주의할 점은 동작 모드 변경을 위해 매뉴얼에서 정의해야 하는 MODE_NAME 상수는 이전 버전 3.1에서 동작 모드를 정의할 때 사용한 방식이다. 이에 주의할 필요가 있습니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿