라이브러리 만들기¶
“라이브러리”라는 용어를 사용할 때 일반적으로 libraries 디렉터리에 있고 이 사용자 가이드의 클래스 레퍼런스에 설명된 클래스를 말합니다. 하지만 여기서는 로컬 리소스와 전역 프레임워크 리소스를 분리하기 위해 application/libraries 디렉터리 내에 자신만의 라이브러리를 만드는 방법을 설명합니다.
추가 보너스로 CodeIgniter는 기존 라이브러리에 일부 기능만 추가해야 하는 경우 기본 클래스를 확장할 수 있습니다. 또는 application/libraries 디렉터리에 동일한 이름의 버전을 배치하여 기본 라이브러리를 교체할 수도 있습니다.
요약하면:
완전히 새로운 라이브러리를 만들 수 있습니다.
기본 라이브러리를 확장할 수 있습니다.
기본 라이브러리를 교체할 수 있습니다.
아래 페이지에서 이 세 가지 개념을 자세히 설명합니다.
참고
데이터베이스 클래스는 자신만의 클래스로 확장하거나 교체할 수 없습니다. 다른 모든 클래스는 교체/확장이 가능합니다.
저장소¶
라이브러리 클래스는 application/libraries 디렉터리에 저장해야 합니다. CodeIgniter가 초기화될 때 이 디렉터리에서 찾습니다.
명명 규칙¶
파일 이름은 대문자로 시작해야 합니다. 예: Myclass.php
클래스 선언은 대문자로 시작해야 합니다. 예: class Myclass
클래스 이름과 파일 이름은 일치해야 합니다.
클래스 파일¶
클래스는 다음과 같은 기본 프로토타입을 가져야 합니다:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Someclass {
public function some_method()
{
}
}
참고
Someclass라는 이름은 순전히 예시로 사용합니다.
클래스 사용¶
컨트롤러 메소드 내에서 표준 방법으로 클래스를 초기화할 수 있습니다:
$this->load->library('someclass');
여기서 someclass는 “.php” 파일 확장자 없이 파일 이름입니다. 파일 이름을 대문자 또는 소문자로 지정할 수 있습니다. CodeIgniter는 상관하지 않습니다.
로드되면 소문자 버전을 사용하여 클래스에 접근할 수 있습니다:
$this->someclass->some_method(); // 오브젝트 인스턴스는 항상 소문자입니다
클래스 초기화 시 매개변수 전달¶
라이브러리 로딩 메소드에서 두 번째 매개변수를 통해 배열로 동적으로 데이터를 전달할 수 있으며, 이 데이터는 클래스 생성자로 전달됩니다:
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('someclass', $params);
이 기능을 사용하는 경우 클래스 생성자가 데이터를 받을 수 있도록 설정해야 합니다:
<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Someclass {
public function __construct($params)
{
// $params로 무언가를 합니다
}
}
config 파일에 저장된 매개변수도 전달할 수 있습니다. 클래스 파일 이름과 동일한 이름의 config 파일을 만들고 application/config/ 디렉터리에 저장하면 됩니다. 위에서 설명한 것처럼 동적으로 매개변수를 전달하면 config 파일 옵션을 사용할 수 없습니다.
라이브러리 내에서 CodeIgniter 리소스 활용¶
라이브러리 내에서 CodeIgniter의 기본 리소스에 접근하려면 get_instance() 메소드를
사용하세요. 이 메소드는 CodeIgniter 슈퍼 오브젝트를 반환합니다.
일반적으로 컨트롤러 메소드 내에서 $this 구문을 사용하여 사용 가능한 CodeIgniter
메소드를 호출합니다:
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
// 등
하지만 $this는 컨트롤러, 모델, 뷰 내에서만 직접 작동합니다. 자신만의 커스텀 클래스
내에서 CodeIgniter의 클래스를 사용하려면 다음과 같이 할 수 있습니다:
먼저 CodeIgniter 오브젝트를 변수에 할당합니다:
$CI =& get_instance();
오브젝트를 변수에 할당하면 $this 대신 해당 변수를 사용합니다:
$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
// 등
참고
위의 get_instance() 함수가 참조로 전달되고 있음을 알 수 있습니다:
$CI =& get_instance();
이것은 매우 중요합니다. 참조로 할당하면 복사본을 만드는 대신 원래 CodeIgniter 오브젝트를 사용할 수 있습니다.
하지만 라이브러리는 클래스이므로 OOP 원칙을 최대한 활용하는 것이 좋습니다. 따라서 모든 클래스 메소드에서 CodeIgniter 슈퍼 오브젝트를 사용할 수 있도록 프로퍼티에 할당하는 것을 권장합니다:
class Example_library {
protected $CI;
// 프로퍼티 정의에서 함수를 직접 호출할 수 없으므로 생성자를 사용합니다.
public function __construct()
{
// CodeIgniter 슈퍼 오브젝트 할당
$this->CI =& get_instance();
}
public function foo()
{
$this->CI->load->helper('url');
redirect();
}
public function bar()
{
echo $this->CI->config->item('base_url');
}
}
자신만의 버전으로 기본 라이브러리 교체¶
클래스 파일 이름을 기본 라이브러리와 동일하게 지정하면 CodeIgniter가 기본 라이브러리 대신 해당 파일을 사용합니다. 이 기능을 사용하려면 파일 이름과 클래스 선언을 기본 라이브러리와 정확히 동일하게 해야 합니다. 예를 들어 기본 Email 라이브러리를 교체하려면 application/libraries/Email.php 파일을 만들고 다음과 같이 클래스를 선언합니다:
class CI_Email {
}
대부분의 기본 클래스에는 CI_ 접두사가 붙어있습니다.
라이브러리를 로드하려면 표준 로딩 메소드를 사용합니다:
$this->load->library('email');
참고
현재 데이터베이스 클래스는 자신만의 버전으로 교체할 수 없습니다.
기본 라이브러리 확장¶
기존 라이브러리에 일부 기능만 추가하면 되는 경우, 즉 메소드를 하나 또는 두 개 추가하는 경우라면 전체 라이브러리를 자신만의 버전으로 교체하는 것은 과도합니다. 이 경우 단순히 클래스를 확장하는 것이 좋습니다. 클래스 확장은 몇 가지 예외를 제외하면 클래스 교체와 거의 동일합니다:
클래스 선언은 부모 클래스를 확장해야 합니다.
새 클래스 이름과 파일 이름에는 MY_ 접두사를 붙여야 합니다 (이 항목은 구성 가능합니다. 아래 참조).
예를 들어 기본 Email 클래스를 확장하려면 application/libraries/MY_Email.php라는 파일을 만들고 다음과 같이 클래스를 선언합니다:
class MY_Email extends CI_Email {
}
클래스에서 생성자를 사용해야 하는 경우 부모 생성자를 반드시 확장하세요:
class MY_Email extends CI_Email {
public function __construct($config = array())
{
parent::__construct($config);
// 자신만의 생성자 코드
}
}
참고
모든 라이브러리가 생성자에 동일한 (또는 어떤) 매개변수를 가지고 있지는 않습니다. 먼저 확장하려는 라이브러리를 살펴보고 어떻게 구현해야 하는지 확인하세요.
서브클래스 로드¶
서브클래스를 로드하려면 일반적으로 사용하는 표준 구문을 사용합니다. 접두사를 포함하지 마세요. 예를 들어 Email 클래스를 확장하는 위의 예시를 로드하려면 다음을 사용합니다:
$this->load->library('email');
로드되면 확장하는 클래스에 대해 일반적으로 사용하는 것처럼 클래스 변수를 사용합니다. email 클래스의 경우 모든 호출은 다음을 사용합니다:
$this->email->some_method();
자신만의 접두사 설정¶
자신만의 서브클래스 접두사를 설정하려면 application/config/config.php 파일을 열고 다음 항목을 찾으세요:
$config['subclass_prefix'] = 'MY_';
모든 기본 CodeIgniter 라이브러리에는 CI_ 접두사가 붙으므로 그것을 접두사로 사용하지 마세요.