라이브러리 생성 Creating Libraries

우리가 “라이브러리(Libraries)”라고 말할 때는 일반적으로 libraries 폴더안에 위치하며 본 사용자 가이드에 설명되어있는 그것을 뜻합니다.하지만 여기서는 그 라이브러리가 아니라 님하가 어떻게 application/libraries 저장될 당신만의 라이브러리를 만들지를 설명합니다. 또한 그 라이브러리를 글로벌 라이버러리와 어떻게 분리하여 관리하는지도 설명합니다.

보너스로 CodeIgniter 는 기존의 라이브러리를 확장하여 (extend) 당신만의 라이브러리를 만들 수 있도록 지원합니다. 아니면 이미 내장된 라이브러리를 application/libraries 에 저장된 동일한 버전 및 이름의 님하가 만든라이브러리도 대체할 수도 있습니다.

요약하면:

  • 완전히 새로운 라이브러리를 만들 수 있습니다.
  • 내장된 라이브러리를 확장하여 만들 수 있습니다.
  • 내장된 라이브러리를 교체할 수 있습니다.

아래에 설명된 내용들은 이러한 3가지를 어떻게 할 수 있는지 상세하게 설명합니다.

Note

데이터베이스 클래스는 확장되거나 대체될 수 없습니다. 그외 모든 클래스는 확장,대체될 수 있습니다.

저장 Storage

당신의 라이브러리는 반드시 application/libraries 에 위치해야 합니다.CodeIgniter 가 초기화 과정에서 그 디렉토리를 살펴보기 때문입니다.

이름짓기 관례 Naming Conventions

  • 파일이름은 반드시 대문자로 시작해야 합니다. 예: Myclass.php
  • 클래스 선언부는 반드시 대문자로 시작해야 합니다. 예: class Myclass
  • 클래스명과 파일명은 반드시 동일해야 합니다.

클래스 파일 The Class File

클래스는 반드시 아래의 프로토타입 형태를 따라야 합니다:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Someclass {

        public function some_method()
        {
        }
}

Note

Someclass 이라는 이름은 예를 든것입니다.

여러분의 클래스를 사용하기 Using Your Class

어떤 여러분의 컨트롤러(Controller) 함수에서도 여러분의 클래스를 아래와 같이 초기화 할 수 있습니다:

$this->load->library('someclass');

someclass 는 파일 이름이고 ”.php” 확장자는 붙이지 않습니다.여기에서 파일 이름을 대문자로 쓰든 소문자로 쓰든 CodeIgniter 는 상관하지 않고 인식합니다.

일단 로드되면 여러분의 클래스를 lower case 소문자 버전으로 사용해야 합니다:

$this->someclass->some_method();  // Object instances will always be lower case

여러분의 클래스 초기화 과정에 파라미터 넘겨주기 Passing Parameters When Initializing Your Class

라이브러리 로드 함수에서 두 번째 파라미터를 통하여 동적으로 데이터를 넘겨줄 수 있습니다. 파라미터는 클래스 생성자에 데이터를 넘겨줄 것입니다:

$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)
        {
                // Do something with $params
        }
}

여러분의 config 파일에 저장된 데이터를 파라미터로 전달할 수 있습니다.간단히 클래스의 파일이름과 동일한 config 파일을 생성하여 application/config/ 폴더안에 저장하세요 . 위에 기술된대로 동적으로 파라미터를 전달한다면 config 을 이용하는 방법은 비활성(will not be available)화 될 것입니다.

CodeIgniter 리소스를 여러분의 라이브러리와 함께 사용하기 Utilizing CodeIgniter Resources within Your Library

직접 만든 라이브러리에서 CodeIgniter에 내장된 리소스를 이용하려면 get_instance() 함수를 이용합니다. 그 함수는 CodeIgniter 의 부모 객체(super object)를 리턴합니다.

일반적으로 당신이 만든 컨트롤러함수에서 $this 를 사용하여 CodeIgniter의 가능한 모든 함수들을 호출할 것입니다:

$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
// etc.

그러나 $this 는 컨트롤러,뷰,모델에서만 직접적으로 사용할 수 있습니다. 만약 당신이 만든 라이브러리(custom class) 에서 CodeIgniter의 클래스를 사용하고자한다면 아래와 같은 방법으로 해야 합니다:

먼저 CodeIgniter객체를 변수로 할당합니다:

$CI =& get_instance();

한 번 할당한 후에는 $this 를 썼던 것 대신에 새로할당한 변수($CI)를 대신 사용하면 됩니다:

$CI =& get_instance();

$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
// etc.

Note

위에 사용된 get_instance() 는 객체를 참조로 넘겨줍니다:

$CI =& get_instance();

이것은 매우 중요합니다. 참조로 넘겨준다는 것은 복사본이 아니라 원본의CodeIgniter 객체를 사용한다는 것을 의미합니다.

그러나 라이브러리는 클래스이기 때문에, OOP 규칙을 최대한 활용한다면 더 좋을 것입니다. 그래서 모든 클래스 객체에서 CodeIgniter super 객체를 사용하기 위해 속성을 대신 지정합니다:

class Example_library {

        protected $CI;

        // We'll use a constructor, as you can't directly call a function
        // from a property definition.
        public function __construct()
        {
                // Assign the CodeIgniter super-object
                $this->CI =& get_instance();
        }

        public function foo()
        {
                $this->CI->load->helper('url');
                redirect();
        }

        public function bar()
        {
                echo $this->CI->config->item('base_url');
        }

}

내장 라이브러리의 확장 Replacing Native Libraries with Your Versions

내장 라이브러리에 몇몇 기능요소들을 추가하려한다면(아마 한두 개의 함수추가) 라이브러리 자체를 바꾸는 것은 심한 오버헤드가 될것입니다. 이럴때는 간단히 내장라이브러리를 확장하는 것이 현명합니다. 라이브러리확장은 몇 가지를 제외하고는 라이브러리대체와 거의 비슷합니다. 예를 들어, 내장 Email 클래스를 확장하고자 한다면 application/libraries/Email.php 파일을 생성하고 클래스를 아래와 같이 선언합니다:

class CI_Email {

}

대부분의 내장 클래스는 CI_ 로 시작한다는 것을 기억하세요.

당신의 라이브러리를 로드 하라면 표준 로딩 함수를 사용하면 됩니다:

$this->load->library('email');

Note

데이터베이스 클래스는 자신만의 클래스로 교체될 수 없습니다.

내장 라이브러리의 확장 Extending Native Libraries

내장 라이브러리에 몇몇 기능요소들을 추가하려한다면(아마 한두 개의 함수추가) 라이브러리 자체를 바꾸는 것은 심한 오버헤드가 될것입니다. 이럴때는 간단히 내장라이브러리를 확장하는 것이 현명합니다. 라이브러리확장은 몇 가지를 제외하고는 라이브러리대체와 거의 비슷합니다:

  • 클래스는 부모클래스(parent class)를 확장해야 한다.
  • 당신의 클래스이름 및 파일이름은 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);
        }

}

Note

모든 라이브러리가 생성자에서 똑같은 파라미터를 가지고 있는 것은 아닙니다.

당신의 확장 클래스를 로드하는법 Loading Your Sub-class

새롭게 만든 확장 클래스는 일반적인 클래스 로드와 동일한 방법으로 로드합니다. 이때 접두어는 적으시면 안됩니다. 예를 들어, 위의 예에서 만든 Email 클래스의 확장 클래스를 로드할 때 아래와 같이 합니다:

$this->load->library('email');

한 번 로드한 후에는 다른 일반적인 방법(확장하기전의 원본클래스를 사용하듯)과 동일하게 사용하면 됩니다. 위에서 만든 Email 클래스의 경우 아래와 같이 사용합니다:

$this->email->some_method();

나만의 접두어 설정 Setting Your Own Prefix

나만의 접두어를 설정하려면 application/config/config.php 파일을 열어 아래 변수를 찾으세요:

$config['subclass_prefix'] = 'MY_';

모든 CodeIgniter 내장 라이브러리는 접두어로 CI_ 를 사용하므로 위 설정에서는 CI_ 를 사용하지 마세요.