'codeIgniter'에 해당하는 글 22건

Libraries

Programming/CodeIgniter 2011. 11. 11. 19:17

1. 클래스 초기화

CodeIgniter의 모든 라이브러리는 system/libraries 디렉토리에 위치합니다.
이 클래스들을 사용하기 위해서는 controller에서 초기화를 해야 합니다.

// library : Form_validation.php
$this->load->library('form_validation');


2. 클래스 파일

사용자는 application/libraries 에 새로운 라이브러리를 만들수도 있고, 기존 라이브러리를 확장하거나 대체할 수도 있습니다.
(Database 클래스만은 확장, 대체가 불가능 합니다.)
클래스 파일의 이름은 대문자로 시작해야 하며, 클래스 정의 이름과 같아야 합니다.

Class 의 기본 프로토타입.

$ vi application/libraries/Someclass.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

    public function some_function()
    {
    }
}
/* End of file Someclass.php */


3. 클래스 초기화시에 파라미터 전달

library 로딩 함수에 두번째 파라미터로 배열을 전달할 수 있으며, 이 데이터는 클래스 생성자로 전달됩니다.

// Controller
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('Someclass', $params);

// library
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

    public function __construct($params)
    {
        // Do something with $params
    }
}
?>


4. 라이브러리 확장

내장 라이브러리에 기능 추가 등을 위해 확장할 수 있습니다.
내장 라이브러리는 CI_로 시작하고 사용자 라이브러리는 MY_로 시작해야 합니다.
(application/config/config.php 파일에서 변경 가능)

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

확장한 클래스에서 생성자를 사용하려면 부모 생성자를 확장하여 사용해야 합니다.

class MY_Email extends CI_Email {

    public function __construct()
    {
        parent::__construct();
    }
}


5. 라이브러리에서 CodeIgniter 리소스 사용

일반적으로 controller 에서 $this를 사용하여 CodeIgniter의 모든 함수를 호출할 것입니다.

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

만약 사용자 라이브러리에서 CodeIgniter의 클래스를 사용하기 원한다면
get_instance() 함수를 사용하여 사용자 라이브러리에서 CodeIgniter 리소스를 사용할 수 있습니다.
이 함수는 CodeIgniter의 부모 객체를 반환합니다.
변수에 CodeIgniter 객체를 할당하여 $this 대신에 사용할 것입니다.

$CI =& get_instance();

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

참조로 객체를 생성한 것은 원본의 CodeIgniter 객체을 사용한다는 것입니다.
(PHP4에서는 get_instance() 함수를 호출할 수 없습니다.)

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Helpers

Programming/CodeIgniter 2011. 11. 11. 19:06

각 helper 함수들은 특정 카테고리에 대한 단순한 함수 모음입니다. Form, Text, URL, Cookie...
특정 helper 를 로딩 후에 controller 와 view 에서 helper 의 함수들을 사용할 수 있습니다.
application/helpers 디렉토리에 사용자 정의 helper 와 함수들을 만들 수 있습니다.
CodeIgniter는 helper 파일을 application/helpers 디렉토리에서 먼저 찾아보고 없다면 system/helpers 디렉토리를 찾습니다.

다음은 controller에서 url_helper.php 파일을 로딩하여 링크를 생성해 주는 anchor 함수를 사용한 예입니다.

$ vi application/controllers/test1.php
class Test1 extends CI_Controller {

    public function index()
    {
        $this->load->helper('url');
        echo anchor('test2', 'click here');
    }
}

Helper 로딩 함수는 값을 리턴하지 않으므로, 변수 등에 저장할 수 없습니다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Views

Programming/CodeIgniter 2011. 11. 11. 08:00

view 파일들은 기본적으로 application/views 디렉토리에 위치하는 단순한 html 웹페이지 입니다.
controller에서 $this->load->view('viewfilename') 구문을 사용하여 view 파일들을 호출하며 직접 호출할 수는 없습니다.
확장자가 .php 일때는 확장자를 생략해도 됩니다.
view 로딩 함수의 두번째 파라미터에 array나 object를 추가하여 view에 데이터를 전달할 수 있습니다.

<?php
class Blog extends CI_Controller {

    function index()
    {
        $data['title'] = "My Real Title";
        $data['heading'] = "My Real Heading";
        $this->load->view('header');
        $this->load->view('menu');
        $this->load->view('content', $data);
        $this->load->view('footer');
    }
}
?>

view 파일에서는 원하는 곳에 array의 key를 넣습니다.

$ vi application/views/content.php
<html>
<head>
<title><?php echo $title;?></title>
</head>

<body>
    <h1><?php echo $heading;?></h1>
</body>
</html>

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

1. 함수 호출 재매핑(Remapping Function Calls)

위 예제에서 URI의 두번째 세그먼트는 호출될 controller의 함수라고 하였습니다.
하지만 _remap() 함수를 사용하여 오버라이드를 할 수 있습니다.
controller에 _remap() 함수가 있다면, 항상 호출되어 사용자가 작성한 라우팅 규칙대로 실행될 것입니다.
URI의 두번째 세그먼트(함수명)부터는 _remap() 함수의 매개변수로 전달될 것입니다.

public function _remap($method, $params = array())
{
    $method = 'process_'.$method;
    if (method_exists($this, $method))
    {
        return call_user_func_array(array($this, $method), $params);
    }
    show_404();
}

위 예제에서 배열로 전달된 매개변수들은 재정의된 함수로 전달될 것입니다.


2. 출력 처리(Processing Output)

웹브라우저로 마지막 렌더링된 데이터를 출력하는 view 와 output class가 있습니다.
마지막 데이터가 웹브라우저로 보내지기 전에 처리를 해야 할 것이 있다면 controller에 _output() 함수를 추가합니다.
controller에 _output() 함수가 있다면 마지막 데이터가 보여지기 전에 항상 호출될 것입니다.

public function _output($output)
{
    echo $output;
}

_output() 함수는 마지막 상태의 데이터를 받게 되므로, 벤치마크와 메모리 사용 데이터, 캐시파일 작성등은 _output() 함수를 사용하기 전 상태입니다.
controller의 output이 정확하게 캐시된 것을 확인하려면 output의 메소드들을 이용할 수 있습니다.

if ($this->output->cache_expiration > 0)
{
    $this->output->_write_cache($output);
}

_output 함수는 페이지 실행시간 및 메모리 사용 상태 정보가 정확하지 않을 수 있습니다.


3. 하위 디렉토리의 controllers 구조

큰 어플리케이션을 개발할 때는 controller를 하위 디렉토리로 구분하는 것이 편리합니다.
간단하게 application/controllers 디렉토리 밑으로 나열하면 됩니다.

application/controllers/products/shoes.php
mydomain.com/index.php/products/shoes/show/123

서브 디렉토리 각각 index 같은 기본적으로 불려질 controller를 application/config/routes.php 파일에서 설정해야 합니다.


4. 클래스 생성자

controller 에서 생성자를 사용할 때는 생성자가 부모 controller 클래스의 생성자를 오버라이딩하기 때문에 반드시 아래처럼 코드를 입력해야 합니다.

parent::__construct();

생성자는 클래스가 초기화될 때 기본값을 설정하거나, 기본 프로세스를 수행해야 할 때 유용합니다.
생성자는 값을 반환할 수 없습니다.

<?php
class Blog extends CI_Controller {

       public function __construct()
       {
            parent::__construct();
            // Your own constructor code
       }
}
?>


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,


1. Controller

controller는 URI에 할당할 수 있게 이름 지어진  클래스 파일입니다.

mydomain.com/index.php/blog/


위의 예는 CodeIgniter 가 blog.php 라는 controller를 찾아 호출하려고 할 것입니다.
controller의 이름과 URI의 첫번째 세그먼트가 일치하면, 그 controller는 호출될 것입니다.
controller의 기본 디렉토리는 application/controllers 입니다.

위 주소를 입력했을 때 Hello World! 를 출력하도록 blog.php 파일을 작성하겠습니다.

$ vi application/controllers/blog.php

<?php
class Blog extends CI_Controller {

    public function index()
    {
        echo 'Hello World!';
    }

    public function comments()
    {
        echo 'Look at this!';
    }
}
?>


class 이름의 첫글자가 대문자임을 확인할 수 있습니다.
항상 controller가 부모 controller class 를 확장하면 모든 함수를 상속받을 수 있습니다.
위 함수의 함수 이름은 index() 이며, index 함수는 URI의 두번째 세그먼트가 명시되어 있지 않으면 호출됩니다.
URI의 두번째 세그먼트는 controller에서 호출될 함수를 결정합니다.

mydomain.com/index.php/blog/comments


위 요청은 'Look at this!'를 화면에 출력합니다.


2. URI에서 함수로 매개변수 전달

URI에 두개 이상의 세그먼트가 있다면, 세번째 세그먼트 부터는 함수에 매개변수로 전달될 것입니다.

mydomain.com/index.php/products/shoes/sandals/123


위 요청의 sandals와 123은 shoes함수의 매개변수로서 전달이 됩니다.

<?php
class Products extends CI_Controller {

    public function shoes($sandals, $id)
    {
        echo $sandals;
        echo $id;
    }
}
?>

 
URI Routing 기능을 사용하면, 함수에 전달된 세그먼트는 또 다른 주소로 라우팅될 수 있습니다.


3. Default Controller

URI에 controller를 지정하지 않았을 때 호출되어야 하는 controller는 application/config/routes.php 파일에서 설정 가능합니다.

$route['default_controller'] = 'Blog';



4. Private 함수

공개적인 접근으로부터 특정 함수를 숨기길 원할 때도 있을 것입니다.
private 함수를 만들려면 함수 이름 앞에 언더바(_)만 추가하면 되며 URL 요청으로는 접근할 수 없게 됩니다.

private function _utility()
{
    // some code
}

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,