PHP CodeIgniter 프레임 워 크 의 작업 원리 연구

CodeIgniter(이하CI,홈 페이지 및중국 역)는 유행 하 는 PHP 프레임 워 크 로 작고 기능 이 강 하 며 간결 하고 가 벼 우 며 확장 성 이 뛰 어 나 국내 에서 도 인기 가 많다.다른 한편,CI 는 시대와 함께 발전 하지 않 았 고 PHP 5.3 이후 의 일부 특성 을 지원 하지 않 아 오래된 프로젝트 에 상대 적 으로 적합 하 다.그럼 에 도 불구 하고 CI 는 우수한 구조 이 고 그 자체 의 커 널 이 작고 소스 코드 가 우아 하 며 학습 에 적합 하 다.
CI 는 사용 하기 쉽 고 웹 애플 리 케 이 션 을 편리 하 게 개발 할 수 있 습 니 다.CI 의 작업 흐름 도 를 살 펴 보 겠 습 니 다.

1.index.php 는 전단 컨트롤 러 로 서 CodeIgniter 를 실행 하 는 데 필요 한 기본 자원 을 초기 화 합 니 다.
2.Router 는 누가 요청 을 처리 할 지 확인 하기 위해 HTTP 요청 을 검사 합 니 다.
3.캐 시(Cache)파일 이 존재 하면 일반적인 시스템 실행 순 서 를 돌아 브 라 우 저 에 직접 보 냅 니 다.
4.보안(Security).응용 프로그램 컨트롤 러(Application Controller)가 불 러 오기 전에 HTTP 요청 과 사용자 가 제출 한 데 이 터 를 걸 러 냅 니 다.
5.컨트롤 러(Controller)는 모델,핵심 라 이브 러 리,보조 함수,그리고 특정한 요청 을 처리 하 는 데 필요 한 다른 자원 을 불 러 옵 니 다.
6.최종 보기(View)가 웹 브 라 우 저 에 보 낸 내용 을 렌 더 링 합 니 다.캐 시(Caching)를 열 면 보기 가 먼저 캐 시 되 기 때문에 다음 요청 에 사용 할 수 있 습 니 다.
이상 은 대체적인 절 차 를 제시 했다.브 라 우 저 에 페이지 가 나타 나 는 것 을 보 았 을 때 프로그램 내 부 는 어떻게 작 동 합 니까?
다음은 실행 순서에 따라 CI 프레임 워 크 에 주로 불 러 오 는 파일 을 순서대로 열거 하고 그 역할 을 간략하게 소개 합 니 다.
01. index.php
사용 환경 정의(ENVIRONMENT),프레임 경로(systempath,BASEPATH),응용 디 렉 터 리(applicationfolder),응용 경로(APPPATH)등,CI 핵심 파일 불 러 오기(require)
02.BASEPATH/core/codeIgniter.php(ps.실제 BASEPATH 는 마지막 파일 구분자'/'를 포함 하고 있 습 니 다.여기에'/'를 추가 로 추가 한 것 은 더 선명 하 게 보 여주 기 위해 서 입 니 다)
시스템 초기 화 파일,전체 프레임 워 크 의 가장 핵심 적 인 부분,여기에 일련의 base class 를 불 러 오고 이 요청 을 실행 합 니 다.
03. BASEPATH/core/Common.php
common 파일 은 일련의 기초 와 공공 함 수 를 포함 하여 전역 적 으로 사용 할 수 있 습 니 다.예 를 들 어 loadclass(),get_config()등
04. BASEPATH/core/Benchmark
이것 은 기본 테스트 클래스 로 각 단계 의 실행 점 을 기본적으로 표시 하여 실행 시간 을 얻 습 니 다.모니터링 지점 도 스스로 정의 할 수 있 습 니 다.
05. BASEPATH/core/Hooks.php
CI_Hooks 는 갈고리 류 로 프레임 워 크 를 확장 하 는 핵심 입 니 다.프로그램 이 허용 하 는 각 단계 에 연결 점 을 삽입 하고 사용자 정의 클래스,함수 등 을 실행 할 수 있 습 니 다.
06. BASEPATH/core/Config.php
파일 관리 클래스 설정,읽 기 또는 설정 불 러 오기
07. BASEPATH/core/URI.php, BASEPATH/core/Router.php
URI 클래스 는 요청 한 uri 를 분석 하고 uri 를 분할 하 는 함수 집합 을 제공 합 니 다.Router 클래스 에서 사용 할 수 있 습 니 다.
08. BASEPATH/core/Router.php
루트 클래스,즉 요청 한 uri 와 사용자 가 설정 한 루트(APPPATH/config/routes.php)를 통 해 사용자 요청 을 지정 한 처리 함수 에 배포 합 니 다.
09. BASEPATH/core/Output.php, BASEPATH/core/Input.php
입력 클래스,즉 요청 한 입력 파 라 메 터 를 처리 하여 안전 한 가 져 오 는 방식 을 제공 합 니 다.출력 클래스 는 마지막 실행 결 과 를 보 내 고 캐 시 기능 도 담당 합 니 다.
10. BASEPATH/core/Controller.php
컨트롤 러 기본 클래스 는 단일 모드 로 인 스 턴 스 를 제공 하고 전체 응용 프로그램의 심장 을 제공 합 니 다.이것 은 Super Object 입 니 다.응용 프로그램 에 불 러 온 클래스 는 컨트롤 러 의 구성원 변수 가 될 수 있 습 니 다.이 점 은 매우 중요 합 니 다.나중에 계속 할 것 입 니 다.         언급 하 다.
11. APPPATH/controllers/$RTR->fetch_directory().$RTR->fetch_class().'.php'
경로 기능 을 통 해 컨트롤 러 이름 을 얻 고 실제 컨트롤 러 클래스(하위 클래스)를 예화 합 니 다.
12. BASEPATH/core/Loader.php
CI_Loader 는 응용 프로그램의 각종 라 이브 러 리,모델,보기,데이터베이스,파일 등 을 불 러 오고 컨트롤 러 의 구성원 변 수 를 설정 합 니 다.
13. call_user_func_array 호출 처리 함수
루트 를 통 해 action 함수 이름 을 얻 고 컨트롤 러->action()함 수 를 호출 하 며 응용 논 리 를 처리 합 니 다.실제 업무 처리 논 리 는 action 함수 에 적 힌 것 입 니 다.
14. $OUT->_display()내용 출력
이상 은 전체 응용 프로그램의 가장 기본 적 인 처리 절차 입 니 다.다음은 핵심 내용 코드 를 선택 하여 설명 함으로써 CI 에 대한 이 해 를 강화 합 니 다.

<?php
//*BASEPATH/system/core/Common.php
	//     Benchmark,Hooks,Config              
	function &load_class($class, $directory = 'libraries', $prefix = 'CI_')
	{
		//       
		static $_classes = array();

		//      ,       
		if (isset($_classes[$class]))
		{
			return $_classes[$class];
		}

		$name = FALSE;

		//             
		foreach (array(APPPATH, BASEPATH) as $path)
		{
			if (file_exists($path.$directory.'/'.$class.'.php'))
			{
				$name = $prefix.$class;

				if (class_exists($name) === FALSE)
				{
					require($path.$directory.'/'.$class.'.php');
				}

				break;
			}
		}

		//     
		if ($name === FALSE)
		{
			exit('Unable to locate the specified class: '.$class.'.php');
		}

		//            ,is_loaded()     
		is_loaded($class);

		$_classes[$class] = new $name();
		return $_classes[$class];
	}
	//          。           
	function &is_loaded($class = '')
	{
		static $_is_loaded = array();

		if ($class != '')
		{
			$_is_loaded[strtolower($class)] = $class;
		}

		return $_is_loaded;
	}

//*BASEPATH/system/core/Controller.php
class CI_Controller {

	private static $instance;

	public function __construct()
	{
		self::$instance =& $this;
		
		//         (CodeIgniter.php)       (   4,5,6,7,8,9   ),
		//             ,                (super object)
		foreach (is_loaded() as $var => $class)
		{
			$this->$var =& load_class($class);
		}
<span style="white-space:pre">		</span>//  Loader  ,   Loader               <span style="white-space:pre">	</span>
		$this->load =& load_class('Loader', 'core');

		$this->load->initialize();
		
		log_message('debug', "Controller Class Initialized");
	}

	//                 
	public static function &get_instance()
	{
		return self::$instance;
	}
}


//*BASEPATH/system/core/CodeIgniter.php
	// Load the base controller class
	require BASEPATH.'core/Controller.php';

	//                  ,         ,
	//                ,            
	function &get_instance()
	{
		return CI_Controller::get_instance();
	}

	//          
	//   :Router       router->_validate_request()        
	if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php'))
	{
		show_error('Unable to load your default controller. Please make sure the controller specified in your Routes.php file is valid.');
	}

	include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php');

	$class = $RTR->fetch_class(); //Controller class name
	$method = $RTR->fetch_method(); //action name

	//.....

	//        
	// uri   class/function               
	call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));

	//           
	if ($EXT->_call_hook('display_override') === FALSE)
	{
		$OUT->_display();
	}
	

//*BASEPATH/system/core/Loader.php
	//   Loader   model   。          
	public function model($model, $name = '', $db_conn = FALSE)
	{
		$CI =& get_instance();
		if (isset($CI->$name))
		{
			show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
		}

		$model = strtolower($model);

		//    model  path    ,        
		foreach ($this->_ci_model_paths as $mod_path)
		{
			if ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))
			{
				continue;
			}

			if ($db_conn !== FALSE AND ! class_exists('CI_DB'))
			{
				if ($db_conn === TRUE)
				{
					$db_conn = '';
				}

				$CI->load->database($db_conn, FALSE, TRUE);
			}

			if ( ! class_exists('CI_Model'))
			{
				load_class('Model', 'core');
			}

			require_once($mod_path.'models/'.$path.$model.'.php');

			$model = ucfirst($model);

			//     model              。Loader               
			$CI->$name = new $model();

			$this->_ci_models[] = $name;
			return;
		}

		// couldn't find the model
		show_error('Unable to locate the model you have specified: '.$model);
	}

//*BASEPATH/system/core/Model.php
	//__get()       ,                   
	//   Model   __get()       ,   Model  ,             (  $this->var   )       
	function __get($key)
	{
		$CI =& get_instance();
		return $CI->$key;
	}

좋은 웹페이지 즐겨찾기