>백엔드 개발 >PHP 튜토리얼 >CI 프레임워크 소스 코드 읽기: ControllerController.php

CI 프레임워크 소스 코드 읽기: ControllerController.php

WBOY
WBOY원래의
2016-08-08 09:33:201459검색

CI 프레임워크 소스 코드 읽기: ControllerController.php

최근 시간이 촉박해 소스코드 읽기 시리즈 업데이트가 조금 늦어졌습니다. Controller에는 상대적으로 코드가 적기 때문에 이 블로그에서는 먼저 이 파일의 소스 코드 분석을 업데이트하겠습니다.

라우팅 및 배포 후 실제 애플리케이션 컨트롤러는 사용자의 모든 요청을 인계받고 사용자 데이터와의 상호 작용을 담당합니다. CI의 모든 애플리케이션 컨트롤러는 CI_Controller의 하위 클래스여야 합니다(CI의 핵심을 확장하지 않는 한 컨트롤러 상위 클래스는 MY_Controller일 수 있음).

애플리케이션 컨트롤러에서는 다음과 같은 코드를 자주 사용합니다.

/* 加载配置文件 */
$this->load->config("config_app");

/* 加载model */
$this->load->model("user");

/* 加载视图 */
$this->load->view("index");

/* 获取post */
$this->input->post("data",true);

/* 获取 get */
$this->input->get("data",true);

/* 清除xss */
$this->security->xss_clean($data);

/* mark时间点 */
$this->benchmark->mark("app_start");

다음은 어떻게 구현되나요?

이 클래스의 구조는 매우 간단하지만 CI_Controller의 클래스 다이어그램을 게시합니다.

1. _construct() 생성자

여기서 CI는 프로세스를 수행하고 로드된 모든 구성 요소를 CI_Controller에 추가합니다(is_loaded 함수가 로드된 모든 구성 요소를 추적하는 것을 이전에 확인했습니다).

foreach (is_loaded() as $var => $class)
{
    $this->$var =& load_class($class);
}

컨트롤러가 인스턴스화될 때 is_loaded가 추적하는 구성 요소를 살펴보세요.

이것은 $this->input 및 기타 방법을 통해 CI 구성 요소를 호출할 수 있는 이유를 설명합니다.

이것만으로는 충분하지 않습니다. 로더도 가져오겠습니다.

$this->load =& load_class('Loader', 'core');

$this->load->initialize();

이제 Loader 구성 요소를 사용하여 구성($this->load->config)을 로드하고 모델($this->load->model ) 뷰를 로드하고($this->load->view)

CI_Controller는 여러 구성요소를 보유하는 슈퍼 클래스라고 할 수 있습니다. 이러한 점에서 디자인 패턴의 "에이전트 패턴"과 매우 유사합니다.

2. &get_instance

여기서 간단히 설명하면 CI_Controller는 싱글톤 모드 클래스이며, 이 클래스의 인스턴스는 get_instance() 메서드를 통해 획득됩니다. 이 메소드는 CodeIgniter.php의 get_instance 함수에 의해 호출됩니다:

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

다음은 컨트롤러에 대한 몇 가지 힌트입니다.

1. CI의 컨트롤러에서 디렉터리를 사용자 정의할 수 있습니다. 예를 들어, application/controller 디렉터리에 admin 디렉터리를 만들고 새 IndexController를 만듭니다. 그러면 컨트롤러의 URL 액세스 경로는 다음과 같습니다.

test.xq.com/admin/index/

2. 컨트롤러는 너무 많은 로직을 포함해서는 안 되며, 비즈니스 로직은 모델에 캡슐화되어야 합니다.

3. 컨트롤러는 업무에 따라 차별화되어야 합니다. 예를 들어 UserController는 사용자 관련 요청을 처리하고 AppController는 애플리케이션 요청 등을 처리합니다. 이는 원칙이 아니라 방법일 뿐입니다.

4. Controller 클래스 이름은 대문자로 시작해야 하며, 파일 이름은 모두 소문자여야 합니다.

5. 컨트롤러에서 밑줄로 시작하는 메소드는 CI에서 프라이빗 메소드로 간주되어 외부에서 직접 접근할 수 없습니다.

위 내용은 Controller의 전체 내용입니다.

마지막으로 CI_Controller의 소스 코드가 게시됩니다.

class CI_Controller {

    private static $instance;

    /**
     * Constructor
     */
    public function __construct()
    {
        self::$instance =& $this;
        
        foreach (is_loaded() as $var => $class)
        {
            $this->$var =& load_class($class);
        }

        $this->load =& load_class('Loader', 'core');

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

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


위 내용을 포함하여 CI 프레임워크 소스 코드 읽기: Controller.php를 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.