"만들면서 배우는 CodeIgniter" (변종원 지음 / 한빛미디어)를 읽고, 도움이 될만한 활용 팁을 정리해 나간다. 인터넷에서 찾은 정보를 함께 정리한다.



개요


>> "PHP 창시자인 라스무스(Rasmus)는 '프레임워크는 쓰지 말라"고 말했다. 

프레임워크를 사용하면 순수한 PHP보다 성능이 떨어지기 때문인데, 그래도 쓰려면 CodeIgniter를 사용하라는 내용으로 라스무스가 DrupalCon 2008에서 "Simple is Hard"라는 내용으로 발표하였다. 여타의 프레임워크와는 달리, 응답속도와 초당 트랜잭션이 현저하게 높은 것을 확인할 수 있다.


>> 다른 프레임워크는 테이블을 기반으로 모델, 컨트롤러, 뷰에 해당하는 코드를 자동으로 생성하는 방식을 택하며, 하나의 기능을 구현하기 위해서는 테이블/모델/컨트롤러/뷰를 모두 만들어야 하는 제약사항이 있는 경우가 많다. 반면 CodeIgniter는 각 레이어 사이의 결합이 느슨하게 유지되므로, 컨트롤러/뷰만 만들어도 기능이 동작하는 방식을 취했다.


>> Clean URL(간편 URL) 포맷을 지향한다. 또는 RESTful URL, SEO(Search Engine Optimization) 친화적 URL을 지향한다.



CodeIgniter 개발환경 구성하기


캐릭터셋>> CodeIgniter의 모든 파일은 UTF-8을 사용한다. euc-kr을 사용하는 경우 한글이 깨진다.


라이브러리>> output 라이브러리는 자동으로 로드된다. 예를 들어 {elased_time}은 현재 페이지의 실행시간을, {memory_usage}는 페이지의 메모리 사용량을 표시한다.



서버 설정하기


>> CodeIgniter에서 index.php 파일이 Front Controller의 역할을 담당한다. 따라서 URL 호출시 아래와 같이 index.php가 위치해야 한다. 

http://localhost/todo/index.php/main/lists


만약 아래와 같이 URL을 사용하고자 한다면,

http://localhost/todo/main/lists


아파치 서버 설정에서 rewrite_module을 로드하고, AllowOverride All로 설정한다. 그리고 CodeIgniter의 설정 파일인 config/config.php 파일에서 index_page 설정 값을 공백으로 바꾼다.

/*

|--------------------------------------------------------------------------

| Index File

|--------------------------------------------------------------------------

|

| Typically this will be your index.php file, unless you've renamed it to

| something else. If you are using mod_rewrite to remove the page set this

| variable so that it is blank.

|

*/

$config['index_page'] = '';


그리고 프로젝트 루트 디렉토리에 .htaccess 파일을 만든 후 아래와 같이 작성한다.

<IfModule mod_rewrite.c>

    RewriteEngine On


    RewriteBase /


    RewriteCond $1 !^(index\.php|images|captcha|include)

    RewriteCond %{REQUEST_FILENAME} !-f

    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule ^(.*)$ /~socurites/todo/index.php/$1 [L]

</IfModule>





DB 설정하기


DB>> application/config/database.php 파일에서 DB 정보를 설정할 때, pconnect의 값을 FALSE로 설정한다. pconnect 는 다음과 같다.

pconnect - TRUE/FALSE (boolean) - 영속적연결(persistent connection)을 사용할것인지 말것인지 결정합니다.


영속적 연결이라는 말의 의미가 모호한데, Advantages / Disadvantages of pconnect option in CodeIgniter에서 자세히 설명한다. 번역해보았다.

"영속적 연결과 관련해서 BP(Best Practice)를 몇가지 살펴본 후, 아래와 같은 결론을 얻었다.

가능하면, 영속적 연결을 사용하지 말라.

아래와 같은 환경이라면 영속적 연결을 사용하라.

  • 전용 운영 웹서버와 전용 데이터베이스 서버 장비가 있는 경우
  • 웹서버와 데이터베이스를 효과적으로 튜닝한 경우
  • 운영환경과 동일한 테스트 환경이 있는 경우
  • 데이터베이스 접속시 걸리는 시간으로 인해 성능이 저하되는 경우

영속적 연결을 사용하면 아래와 같은 문제가 생길 수 있다.

  • DB 커넥션이 의도한 바와는 다르게 닫하지 않는 버그가 생길 수 있다.
  • DB 커넥션 개수가 한계치를 넘을 수 있다.
  • 많은 수의 유휴 커넥션션으로 인해 많은 메모리가 사용되므로, DB 성능이 저하될 수 있다.
  • 커넥션의 상태가 너무 오랫동안 지속되는(stale) 버그가 생기며, 어플리케이션에서는 이러한 상태를 인식하지 못할 수 있다.
반면 아래와 같은 장점도 있다.
  • 초기 커넥션을 얻을 때 걸리는 시간(latency)이 줄어든다.
정말로 커넥션 latency가 문제를 일으키는 상황이라면, pconnect를 TRUE로 설정한 후 테스트 환경에서 성능을 테스트해본 후 그에 따른 결과를 측정해야 한다."


보안

보안>> php.ini 파일에서 cgi.fix_pathinfo 값을 0으로 바꿔야 한다. 만약 기본값인 1을 그대로 두면, http://localhost/bad.hack/aa.php와 같이 비정상적인 접근을 할 수 있다.

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's

; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok

; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting

; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting

; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts

; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.

; http://php.net/cgi.fix-pathinfo

cgi.fix_pathinfo=0


>> 컨트롤러에 index() 메서드를 선언하면, http://localhost/[컨트롤러]까지만 주소를 입력해도, http://localhost/[컨트롤러]/index로 라우팅 된다. 에러 방지를 위해서라도 index() 메서드는 항상 만드는 게 좋다.


>> 보안 코딩

보안을 고려해서 코드를 작성하려면, 보안과 관련된 함수를 일일이 작성해야 하며, SQL 인젝션 공격을 막기 위해서는 파라미터를 이스케이프 처리해야 하는 등 신경쓰야 할일이 많다. CodeIgniter를 사용하면, XSS 스크립트 공격과 SQL 인젝션 공격에 대응하는 코드를 쉽게 작성할 수 있다. 


>>  SQL 인젝션 막기

SQL 인젝션을 막는 방법에는 3가지가 있다.

1. Model 레이어 - $this->db->escape_str() 함수 사용하기

아래의 예제를 참고한다.

$sql = "SELECT * FROM user WHERE id = '".$this->db->escape_str($id)."' AND password = '".$this->db->escape_str($password)."'";


2. 모델 레이어 - SQL 바인딩 사용하기

아래의 예제를 참고한다.

$sql = "SELECT * FROM user WHERE id =  ? AND password = ?";

$this->db->query($sql, array($id, $password));


3. 컨트롤러 레이어 - $this->input->post() 함수 사용하기

아래와 같이 컨트롤러에서, 파라미터를 필터링한 후 변수에 할당한다. 이후의 모델 레이어에서는 필터링된 값을 가져다 쓰도록 한다.

$id = $this->input->post('id', TRUE);


>>  XSS 막기

SQL 인젝션을 막는 방법에는 개별 필터링, 전역 필터링 2가지가 있다.


1. 개별 필터링

컨트롤러 레이어에서 $this->input->post() 함수를 사용한다.


2. 전역 필터링

config.php 파일에 아래와 같이 설정하여, 모든 POST/GET 입력값에 대해 TRUE가 자동으로 설정되도록 한다.

/*

|--------------------------------------------------------------------------

| Global XSS Filtering

|--------------------------------------------------------------------------

|

| Determines whether the XSS filter is always active when GET, POST or

| COOKIE data is encountered

|

*/

$config['global_xss_filtering'] = TRUE;


전역 설정을 할 경우, textarea에 <span id="test">와 같은 내용이 있는 경우, 자동으로 <spa>으로 치환해버린다. 만약 위지위그 에디터를 사용하는 사이트라면, 전역 필터리응 사용해서는 안된다.


>>  CSRF 막기

CSRF 공격을 막기 위해서는 먼저 config.php 파일에서 csrf_protection 값을 TRUE로 바꿔야 한다.

/*

|--------------------------------------------------------------------------

| Cross Site Request Forgery

|--------------------------------------------------------------------------

| Enables a CSRF cookie token to be set. When set to TRUE, token will be

| checked on a submitted form. If you are accepting user data, it is strongly

| recommended CSRF protection be enabled.

|

| 'csrf_token_name' = The token name

| 'csrf_cookie_name' = The cookie name

| 'csrf_expire' = The number in seconds the token should expire.

*/

$config['csrf_protection'] = TRUE;

$config['csrf_token_name'] = 'csrf_test_name';

$config['csrf_cookie_name'] = 'csrf_cookie_name';

$config['csrf_expire'] = 7200;


그리고 뷰 레이어에서는 <form> 태그를 사용하는 대신, form helper 함수인 form_open() 함수를 사용해야 한다. 

* form_open() 함수를 사용하는 방식은 조금 성가신데...




[참고자료]


Posted by socurites
TAG php

CodeIgniter 프레임워크를 학습한 이력은 다음과 같다.


PoC 결과는 대체적으로 만족스럽다.


MVC 프레임워크이면서도 굉장히 가볍다. 그리고 설치랄 것도 없이 압축만 풀면 그만이다. 별도의 설정이 많이 필요하지도 않다. 가장 큰 이슈였던 스마티와의 연동도 크게 어렵지 않았다. 또한 View와 Controller 사이의 결합도도 거의 없다. 또한 문서화도 상당히 잘 되어 있는 편이고, 사용자 포럼도 활발히 진행되어 피드백을 받기가 쉽다.


약간 성가신 부분은 요청 매핑(Request Mapping) 부분이다. config/routes.php 파일에, 요청을 일일이 기술해야 하는데, 사이트가 커지면서 요청 매핑의 갯수가 많아지면 이러한 중앙집중식 설정은 관리가 다소 애매해진다. 논리적인 단위로 파일을 나눌 수 있는지 확인이 필요하다.


또 다른 문제는 Front Controller다. index.php 파일이 Front Controller 역할을 하는데, 요청 URL에 모두 포함되어야 한다. 예를 들어 다음과 같다.

http://localhost/~socurites/ci-test/index.php/smartytest/index


그렇긴 해도 아파치 웹서버의 .htaccess 설정을 통해 처리할 수 있으니 큰 문제는 아니다.


PoC가 끝났으니, 실제 적용하기 전에, 고려할 사항이나 보안 이슈와 같이 주요한 요소를 찾아봐야 할 것 같다. 이 참에 제대로 해보려고 "CodeIgniter 한국 사용자 포럼" 운영자가 쓴 "만들면서 배우는 CodeIgniter 프레임워크" 책을 구매했다.


책 학습 후에 주요 내용을 정리하고자 한다.



Posted by socurites

CodeIgniter 역시 Smarty와 연동하는 표준 문서가 없어서 약간 헤매기는 했지만, Using Smarty 3 in Codeigniter 2 (a really tiny CI library)의 도움을 얻어서 설치하는데 성공했다.


이 튜토리얼을 따라하려면 반드시 "CodeIginter 프레임워크 사용 이력 - 튜토리얼" 시리즈를 따라하기를 바란다.


먼저 Github의 Vheissu/Ci-Smarty에 가서 ZIP 파일을 다운로드 한다. 압축을 풀어서, application/ 하위에 모두 붙여 넣는다. 3버전대의 스마티가 포함되어 있으므로 별도로 스마티를 다운로드 하지 않아도 된다.


다운로드한 ZIP 파일에는 예제 코드가 포함되어 있다. 예제코드를 실행하기 위해서, routes.php 파일을 아래와 같이 수정한다.

$route['smartytest/index'] = 'smartytest/index';     <--- 추가한 부분

$route['news/create'] = 'news/create';

$route['news/(:any)'] = 'news/view/$1';

$route['news'] = 'news';

$route['(:any)'] = 'pages/view/$1';

$route['default_controller'] = 'pages/view';


{사이트}/index.php/smartytest/index 로 접속하면 smartytest.tpl 파일이 정상적으로 표시되는 것을 확인할 수 있다.


만약 아래와 같은 에러가 웹서버 에러 로그에 나타난다면,

unable to write file application/cache/smarty/compiled


application/cache/smarty 디렉토리의 cached/, complied/ 디렉토리에 웹서버가 쓸 수 있는 권한을 부여해야 한다.



[참고자료]


Posted by socurites

원문: http://www.coolphptools.com/codeigniter-smarty



절대로 최신버전의 CodeIgniter에서는 따라하지 마세요.

동작 안합니다!!!!!



역주) 따라서 다 하고 나서야, 동작이 안된다는 것을 알았을 뿐이고! 2~3년 전 글이었을 뿐이고! 시간을 낭비했을 뿐이고!


CodeIgniter가 생소할 수도 있겠지만, CodeIgniter는 가벼운 Model-VIew-Controller(MVC) 프레임워크로, PHP를 기반으로 한다. CodeIgniter는 EllisLabs에서 만드는 오픈소스 프로젝트다. CodeIgniter는 템플릿 시스템을 내장하고 있지만, 내가 마지막으로 내장 템플릿 시스템을 보았을 떄, 별 기능이 없었다. 또한 내장 템플릿 시스템은 preg_match()와 문자열 치환을 기반으로 페이지를 필터링하는 방식이었다. 만약 트랙피 사이즈가 크지 않고 변수 치환을 많이 사용하지 않는 사이트라면, 이러한 방법도 효과적일 수는 있다. 하지만 트래픽 사이즈가 크게 증가하고, 페이지수가 많은 사이트라면, 이러한 방식은 웹 사이트의 응답시간에 큰 영향을 미친다.


스마티(Smarty)는 또 다른 오픈소스 프로젝트로 템플릿을 처리하며 마찬가지로 PHP로 작성되었다. 스마티는 오랫동안 사용되었고, CodeIgniter에 내장된 단순한 템플릿 엔진에 비해 막강한 기능을 가지고 있다. 스마티는 또한 템플릿을순수한 PHP 파일로 컴파일하기 때문에, 실행할 때 더 빠르다.


템플릿 생성은 개발자들 사이에서 논쟁거리가 되어 왔는데, PHP를 HTML 안에서 직접 사용하는 편이 더 쉽고, 새로운 템플릿 언어를 배워서 똑같은 일을 하는 일이 좀더 어렵다고 느꼈기 때문이다. 개인적으로 나는 코드(PHP)와 뷰(스마티를 사용한 템플릿)을 서로 명확히 분리하는 편을 선호한다. 나는 개발자가 게을러져서 HTML에 로직, 심지어 데이터베이스 호출 로직까지도 추가하는 일을 자주 목격했다. 하지만 이렇게 개발하면, 유지보수하는 일이 쉽게 악몽이 되어버리고 만다. 또한 나는 스마티가 HTML의 <>와는 달리 {}를 구분자로 사용하는 방식이 마음에 든다. 이처럼 구분자가 다르기 때문에, 스마티 태그를 식별하기가 수월해진다. 이러한 사실은 아래의 코드에서 잘 드러난다.


스마티를 사용하는 경우:

<title>{$title}</title>


PHP를 사용하는 경우:

<title><?php echo $title;?></title>


한가지 성가신 점은 HTML에 꺽쇠가 있는 경우다. 예를 들어 인라인 자바스크립트나 인라인 스타일시트를 사용하는 경우다. 이때는 이들 꺽쇠를 반드시 이스케이프 처리를 해야만 스마티 태그로 해석되지 않는다. 또는 스마티로 해석되지 않도록 꺼두고 싶은 영역이 있다면, {literal}과 {/literal}을 사용하면 된다. 예를 들어 다음과 같다.


<script type="text/javascript">

  {literal}

  function a(b, c) {

      alert('function a('+b+', '+c+') called!');

  }

  {/literal}

</script>


{literal}과 {/literal}은 원하는 어디에서도 사용할 수 있는데, 심지어 단일 문자를 감쌀 수도 있다. 하지만 이처럼 이스케이프 처리를 하기 보다는, 외부 자바스크립트 파일 또는 스타일시트 파일을 사용하기를 바란다. 


지금쯤이면 "스마티를 CodeIgniter와 어떻게 같이 사용하죠?"라는 질문이 떠오를 것이다. 이제 내가 어떻게 했는지 약간 시간을 내서 정리하려고 하며, 여러분도 시작할 수 있도록 몇가지 코드와 함께 예제를 보여주고자 한다.



1단계: CodeIgniter 설치하기


만약 아직 CodeIgniter를 설치하지 않았다면, 여기에서 다운로드해서 설치한다.



2단계: 스마티 설치하기


가장 최근의 스마티를 여기에서 다운로드할 수 있다. 나는 /system/libs 디렉토리를 CodeIgniter에 생성해서, smarty 디렉토리를 복사해서 넣었다. 스마티를 다른 위치에 설치하려고 한다면, Smarty.php 라이브러리 모듈에서 해당 스마티 설치 위치를 가리키도록 수정해야 한다. 가리키려는 디렉토리는 반드시 Smarty.class.php 클래스 파일을 포함하고 있어야 한다.



3단계: 템플릿 디렉토리 생성하기

나는 templates 디렉토리(스마티의 루트 템플릿 디렉토리)와 templates_c 디렉토리(스마티 템플릿이 컴파일된 버전이 저장되는 위치)를 /system/application/views에 만들었다. 이번에도 마찬가지로, 템플릿을 다른 위치에 저장하고 싶다면, Smarty.php 파일을 열어서 해당 디렉토리를 가리키도록 수정해야 한다. 이때 templates_c 디렉토리가 어플리케이션에 쓰기 권한을 가지도록 해야 한다.



4단계: 이 사이트에서 제공하는 코드 설치하기

이 사이트의 코드는 스마티와 CodeIgniter를 연동하는 Smarty 라이브러리 클래스와, CodeIgniter 기능에 접근할 수 있도록 돕는 스마티 플러그인 몇가지, 그리고 "example"이라고 불리는 작은 데모를 포함한다.


메인 클래스(물론 나는 클래스 접두어로 MY_ 가 아니라, CI를 사용하고 있다. 하지만 CodeIgniter에는 Smarty라는 이름의 클래스가 없으므로 상관없다)는 CI_Smarty이며, autoload 설정 배열에 "smaty"라는 이름으로 추가할 수 있다. 이는 다른 라이브러리 모듈을 사용하는 방식과 다를게 없다. 메인 Smarty 클래스를 상속받아서 CodeIgniter용 라이브러리로 만들었기 때문에, 기존의 Smarty API 호출을 모두 사용할 수 있다. 나는 여기에 smarty->view()라는 이름의 함수를 추가하였는데, 이 함수는 CodeIgniter의 템플릿 시스템의 parser->parse() 함수처럼 동작하는 유틸리티 함수다. 또한 스마티와 CodeIgniter 라이브러리 사이의 차이를 메울 수 있는 몇가지 플러그인을 추가하여, 템플릿에서 접근할 수 있도록 하였다. 물론 이렇게 하면서도 MVC 패러다임을 부수지 않도록 하였으며, 또한 템플릿을 호출하기 전에 $data 배열에 잡다한 정보를 꾸겨 넣는 대신에, language 파일 데이터, 검증 에러 등과 같은 요소를 더욱 쉽게 사용하도록 했다.


아래는 메인이 되는 Smarty 라이브러리 클래스다.

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


/**

 * Smarty Class

 *

 * @package CodeIgniter

 * @subpackage Libraries

 * @category Smarty

 * @author Kepler Gelotte

 * @link http://www.coolphptools.com/codeigniter-smarty

 */

require_once( BASEPATH.'libs/smarty/libs/Smarty.class.php' );


class CI_Smarty extends Smarty {


    function CI_Smarty()

    {

        parent::Smarty();


        $this->compile_dir = APPPATH . "views/templates_c";

        $this->template_dir = APPPATH . "views/templates";

        $this->assign( 'APPPATH', APPPATH );

        $this->assign( 'BASEPATH', BASEPATH );


        log_message('debug', "Smarty Class Initialized");

    }


    function __construct()

    {

        parent::__construct();


        $this->compile_dir = APPPATH . "views/templates_c";

        $this->template_dir = APPPATH . "views/templates";

        $this->assign( 'APPPATH', APPPATH );

        $this->assign( 'BASEPATH', BASEPATH );


        // Assign CodeIgniter object by reference to CI

        if ( method_exists( $this, 'assignByRef') )

        {

            $ci =& get_instance();

            $this->assignByRef("ci", $ci);

        }


        log_message('debug', "Smarty Class Initialized");

    }



    /**

    *  Parse a template using the Smarty engine

    *

    * This is a convenience method that combines assign() and

    * display() into one step.     

    *

    * Values to assign are passed in an associative array of

    * name => value pairs.

    *

    * If the output is to be returned as a string to the caller

    * instead of being output, pass true as the third parameter.

    *

    * @access public

    * @param string

    * @param array

    * @param bool

    * @return string

    */

    function view($template, $data = array(), $return = FALSE)

    {

        foreach ($data as $key => $val)

        {

            $this->assign($key, $val);

        }

        if ($return == FALSE)

        {

            $CI =& get_instance();

            if (method_exists( $CI->output, 'set_output' ))

            {

                $CI->output->set_output( $this->fetch($template) );

            }

            else

            {

                $CI->output->final_output = $this->fetch($template);

            }

            return;

        }

        else

        {

            return $this->fetch($template);

        }

    }

}

// END Smarty Class


아래는 다운로드에 포함된 모든 파일들이다:


스마티와 연결하기 위해 사용하는 CodeIgniter 라이브러리:

/system/application/libraries/Smarty.php


CodeIgniter 클래스와 연결하기 위한 스마티 플러그인 함수:

/system/libs/smarty/libs/plugins/function.ci_config.php

/system/libs/smarty/libs/plugins/function.ci_db_session.php

/system/libs/smarty/libs/plugins/function.ci_form_validation.php

/system/libs/smarty/libs/plugins/function.ci_language.php

/system/libs/smarty/libs/plugins/function.ci_validation.php


예제 코드:

/system/application/controllers/example.php

/system/application/language/english/label_lang.php

/system/application/views/templates/example.tpl

/system/application/views/templates/header.tpl

/system/application/views/templates/footer.tpl



5단계: CodeIgniter config 수정하기


/system/application/config 디렉토리에 보면, autoload.php 파일이 있다. 파일을 열어서 'smarty'를 자동으로 로드할 라이브러리 클래스 배열에 추가하자.

/*

| -------------------------------------------------------------------

|  Auto-load Libraries

| -------------------------------------------------------------------

| These are the classes located in the system/libraries folder

| or in your application/libraries folder.

|

| Prototype:

|

| $autoload['libraries'] = array('database', 'session', 'xmlrpc');

*/


$autoload['libraries'] = array('smarty');



6단계: 예제 실행하기


모든 단계를 정확하게 설치했다면, http://yourdomain/example에 접속하면, 아래와 같은 화면을 볼 수 있다








Posted by socurites

원문: http://ellislab.com/codeigniter/user-guide/tutorial/create_news_items.html



지금쯤이면 Codegniter를 사용하여 데이터베이스에서 데이터를 읽어오는 방법을 알 것이다. 이제는 데이터베이스에 정보를 추가하는 방법을 알아보자. 이 장에서는 앞서 만든 news 컨트롤러와 모델 클래스를 확장해서, 새로운 뉴스 아이템을 추가하는 방법을 설명하려고 한다.



아이템 생성하기


데이터를 데이터베이스에 입력하기 위해서는 폼(form)을 만들어서 정보를 입력한 후 저장해야 한다. 다시 말해 2개의 필드를 가지는 폼이 필요한데, 하나는 타이틀을 나머지 하나는 텍스트를 입력하기 위한 것이다. slug는 모델의 title로부터 추출하여 만든다.


새로운 뷰 파일인 application/views/news/create.php을 만들자.

<h2>Create a news item</h2>


<?php echo validation_errors(); ?>


<?php echo form_open('news/create')

?>


<label for="title">Title</label>

<input type="input" name="title" />

<br />


<label for="text">Text</label>

<textarea name="text"></textarea>

<br />

<input type="submit" name="submit" value="Create news item" />


</form>


이 코드에서 익숙하지 않은 구문은 단지 2개 뿐이다. form_open() 함수와 validation_errors() 함수다. 


첫 번째 함수는 form_helper가 제공하며, 폼 요소를 렌더링하며 추가적인 기능을 제공한다. 예를 들면 CSFR 보호 필드와 같은 기능이 있다. 두 번째 함수는 폼 검증시 발생하는 에러를 출력하는 기능을 담당한다.


이제 news 컨트롤러로 다시 가자. 여기에서는 2가지 작업이 필요한데, 하나는 전달된 폼이 submit되었는지 확인하는 일과 나머지 일은 전달된 데이터가 유효성 규칙을 만족하는지 확인하는 일이다. 이를 위해서 form_validataion 라이브러리를 사용한다.

public function create() {

    $this -> load -> helper('form');

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


    $data['title'] = 'Create a news item';


    $this -> form_validation -> set_rules('title', 'Title', 'required');

    $this -> form_validation -> set_rules('text', 'text', 'required');


    if ($this -> form_validation -> run() === FALSE) {

        $this -> load -> view('templates/header', $data);

        $this -> load -> view('news/create');

        $this -> load -> view('templates/footer');


    } else {

        $this -> news_model -> set_news();

        $this -> load -> view('news/success');

    }

}


위 코드는 여러가지 기능을 추가한다. 먼저 첫 부분에서는 form_helper와 form_validation 라이브러리를 로드한다. 그리고 나서 폼 검증을 위한 규칙을 설정한다. set_rules() 메서드는 3개의 인자를 받는다. 입력 필드의 이름, 에러 메시지에서 사용할 이름, 그리고 규칙이다. 여기에서는 타이틀과 텍스트는 필수값이다.


CodeIgniter는 앞에서 보는 바와 같이 강력한 폼 검증 라이브러리를 제공한다. 폼 검증 라이브러리에 대한 자세한 설명은 여기에서 살펴보라. 


또한 폼 검증을 실행했을 때 성공했는지 검사하는 조건문이 있다. 만약 성공하지 못한다면, 폼이 재출력된다. 만약 모든 규칙을 통과하면, 모델이 호출된다. 그런 후, 뷰가 로드되어 성공 메시지를 출력한다. application/view/news/success.php 뷰 파일을 만들어서, 적당한 성공 메시지를 작성한다.



모델


마지막으로 데이터베이스에 데이터를 입력하는 메서드를 만들자. Active Record 클래스를 사용하여 정보를 입력하며, input 라이브러리를 사용하여 POST 방식으로 전달된 데이터에 접근할 것이다. 앞서 만든 모델 클래스를 열어서, 아래의 코드를 추가하자.

public function set_news() {

    $this -> load -> helper('url');


    $slug = url_title($this -> input -> post('title'), 'dash', TRUE);


    $data = array('title' => $this -> input -> post('title'), 'slug' => $slug, 'text' => $this -> input -> post('text'));


    return $this -> db -> insert('news', $data);

}


이 메서드에서는 데이터베이스에 새로운 뉴스 아이템을 입력하기 전에 신중한 처리 작업을 한다. 3번째 라인의 새로운 함수인 url_title()이 바로 그 함수다. URL helper 에서 제공하는 이 함수는 문자열을 치환한다. 공백은 모두 대시(-)로, 그리고 모든 문자를 소문자로 변환한다. 이러한 과정을 통해 적당한 slug를 만들 수 있으며, 이는 또한 URI를 만드는데도 제격이다.


데이터베이스 입력할 레코드를 준비하는 작업을 이어서 만든다. 레코드는 $data 배열에 저장한다. 각 요소는 앞서 만든 데이터베이스 테이블의 각 컬럼에 대응한다. 여기에 새로운 메서드가 나오는데, 바로 post() 메서드다. 이 메서드는  input 라이브러리에서 제공한다. 이 메서드는 데이터의 유효성을 검증하여, 공격을 시도하는 공격 문구로부터 보호하도록 해준다. input 라이브러리는 기본적으로 자동으로 로드된다. 마지막으로 $data 배열을 데이터베이스에 입력한다.



라우팅


CodeIgniter 어플리케이션에서 이제 뉴스 아이템을 추가하기 전에, 추가적인 작업이 하나 남아 있는데 바로 config/routes.php 파일에 규칙을 추가하는 일이다. 이 파일을 아래와 같이 수정한다. 이를 통해 CodeIgniter가 'create'을 뉴스 아이템의 slug가 아닌, 메서드로 인식할 수 있게 된다.

$route['news/create'] = 'news/create';

$route['news/(:any)'] = 'news/view/$1';

$route['news'] = 'news';

$route['(:any)'] = 'pages/view/$1';

$route['default_controller'] = 'pages/view';


이제 브라우저를 열어서 index.php/news/create 을 URL에 입력한 후 호출하자. 축하한다! 이제 ㅇ당신은 첫번째 CodeIgniter 어플리케이션을 완성했다. 새로운 뉴스를 몇개 추가해보고, 이전에 만든 나머지 페이지들을 사용해 보자.



Posted by socurites

원문: http://ellislab.com/codeigniter/user-guide/tutorial/news_section.html



지난 튜토리얼에서는 프레임워크의 기본 개념을 익히기 위해서 정적인 페이지를 포함하는 클래스를 작성해 봤다. 또한 URI을 더 깔끔하게 만들기 위해서, 커스텀 라우팅 규칙을 추가했다. 이제 동적인 컨텐츠를 추가하는 방법과, 데이터베이스를 사용하는 방법을 설명할 차례다.



모델 설정하기


데이터베이스를 활용하는 코드를 컨트롤러에 직접 작성하기보다는, 쿼리는 반드시 모델에 위치시켜야만 하는데, 이렇게 분리를 해야만 나중에 재사용하기가 쉽기 때문이다. 모델은 데이터베이스 또는 데이터 저장소로부터 정보를 가져오거나, 추가하고, 수정하기 위한 코드들이 위치하는 곳이다. 여러분이 가진 데이터에 해당하는 부분이 바로 모델이다.


application/models 디렉토리를 열어서, news_model.php 파일을 생성한 후, 아래의 코드를 추가한다.

<?php

class News_model extends CI_Model {

    public function __construct() {

        $this -> load -> database();

    }

}

?>


앞서 만들었던 컨트롤러 코드와 매우 유사하다. 모델은 CI_Model 클래스를 상속받아서 생성한 후, 데이터베이스 라이브러리를 로드하게 된다. 이제 $this->db 객체를 사용하여 데이터베이스 클래스를 사용할 수 있게 된다. 


데이터베이스 쿼리를 실행하기 전에, 먼저 데이터베이스 스키마를 만들어야 한다. 데이터베이스 접속한후, 아래의 SQL 명령어를 실행한다. 그리고 몇가지 샘플 레코드를 추가하자.

CREATE TABLE news (

id int(11) NOT NULL AUTO_INCREMENT,

title varchar(128) NOT NULL,

slug varchar(128) NOT NULL,

text text NOT NULL,

PRIMARY KEY (id),

KEY slug (slug)

);


역주) 아래의 입력문을 사용해서 샘플 데이터를 입력해두자

INSERT INTO news VALUES (1, 'hot item -1', 'pants-1', 'item is selled -1');

INSERT INTO news VALUES (2, 'hot item -2', 'pants-2', 'item is selled -2');

INSERT INTO news VALUES (3, 'hot item -3', 'pants-3', 'item is selled -3');


데이터베이스와 모델에 대한 준비가 되었으므로, 이제 데이터베이스로부터 모든 뉴스를 가져올 수 있는 메서드를 만들어보자. 이를 위해서는 데이터베이스 추상화 레이어가 필요하다. CodeIgniter에서는 Actie Record를 사용한다. 이처럼 추상화 레이어를 사용하ㅔ 되면, 하나의 쿼리만을 사용해서 다양한 데이터베이스 시스템에서 동작하도록 할 수 있게 된다. 아래의 코드를 모델에 추가하자.

public function get_news($slug = FALSE) {

    if ($slug === FALSE) {

        $query = $this -> db -> get('news');

        return $query -> result_array();

    }


    $query = $this -> db -> get_where('news', array('slug' => $slug));

    return $query -> row_array();

}


이 코드를 사용하면 2가지 서로 다른 쿼리를 실행할 수 있다. 모든 뉴스 레코드를 가져오거나, 또는 slug에 해당하는 뉴스 아이템만을 가져올 수도 있다. $slug 변수에 대한 유효성 검증을 하지 않은 채로 쿼리를 실행했다다는 사실을 알 수 있다. Active Record가 검증을 처리하니 신경쓰지 않아도 된다.



뉴스 표시하기


퀴리를 작성하였으니, 이제 모델과 뷰를 연결하여 뉴스 아이템을 사용장에게 표시해야 한다. 이 작업은 앞에서 만든 pages 컨트롤러를 사용하여 처리할 수 있다. 하지만 명료성을 위해서, 새로운 "news"  컨트롤러를 정의하자. application/controllers/news.php 파일을 아래와 같이 생성하자.

<?php

class News extends CI_Controller {

    public function __construct() {

        parent::__construct();

        $this -> load -> model('news_model');

    }


    public function index() {

        $data['news'] = $this -> news_model -> get_news();

    }


    public function view($slug) {

        $data['news'] = $this -> news_model -> get_news($slug);

    }

}

?>


코드를 보면, 앞에서 만든 모델 클래스와 유사하다는 점을 알 수 있다. 먼저, "__construct" 메서드다. 이 메서드에서는 부모 클래스(CI_Controller)의 생성자(__construct)를 호출한 후, 모델을 로드한다. 따라서 컨트롤러 안에서 부모 클래스와 모델 클래스의 메서드를 사용할 수 있게 된다.


두번째, 모든 뉴스 아이템을 보기 위한 메서드(index)와 특정 뉴스 하나를 보기 위한 메서드(view)가 있다. $slug 변수가 두 번째 메서드(view)에서 모델의 메서드에 전달된다는 사실을 볼 수 있다. 모델에서는 $slug 변수를 사용하여 반환할 뉴스 아이템을 식별해 낸다. 


이제 컨트롤러는 모델을 통해서 데이터를 모두가져왔지만, 아직 어느 데이터도 표시하지는 않았다. 다음으로 할일이 바로 데이터를 뷰로 전달하는 일이다.

public function index() {

    $data['news'] = $this -> news_model -> get_news();

    $data['title'] = 'News archive';


    $this -> load -> view('templates/header', $data);

    $this -> load -> view('news/index', $data);

    $this -> load -> view('templates/footer');

}


위의 코드에서는 모델로부터 모든 뉴스 레코드를 가져와서, 변수에 할당한다. 타이틀에 해당하는 값 또한 $data['title'] 요소에 할당한 후, 모든 데이터를 뷰로 전달한다. 이제는 뷰를 생성하여, 뉴스 아이템을 렌더링 해보자. application/views/news/index.php 파일을 만들어서 아래의 코드를 추가하자.

<?php foreach ($news as $news_item): ?>


    <h2><?php echo $news_item['title'] ?></h2>

    <div id="main">

        <?php echo $news_item['text'] ?>

    </div>

    <p><a href="news/<?php echo $news_item['slug'] ?>">View article</a></p>


<?php endforeach ?>


여기에서는 각 뉴스 아이템에 대해 루프를 돌면서 사용자에게 표시한다. 보다시피 여기에서는 템플릿 파일에 PHP와 HTML을 섞어서 작성했다. 만약 템플릿 엔진을 사용하고 싶다면, CodeIgniter에서 제공하는 Template Parser 클래스를 사용하거나, 또는 써드파티 파서를 사용할 수 있다.


뉴스에 대한 개략적인 정보를 보는 페이지는 다 만들었다. 이제 각 뉴스 아이템을 표시하는 페이지를 만들어보자. 앞서 만든 모델은 이 기능을 효과적으로 처리할 수 있는 형식으로 개발했다. 따라서 그저 컨트롤러에 약간의 코드를 추가하고, 새로운 뷰를 하나 만들면 충분하다. news 컨트롤러로 다시 가서, 아래와 코드를 추가하자.

public function view($slug) {

    $data['news_item'] = $this -> news_model -> get_news($slug);


    if (empty($data['news_item'])) {

        show_404();

    }


    $data['title'] = $data['news_item']['title'];


    $this -> load -> view('templates/header', $data);

    $this -> load -> view('news/view', $data);

    $this -> load -> view('templates/footer');

}


get_news() 메서드를 파라미터 없이 호출하는게 아니라, $slug 변수를 전달한다. 그래야만 특정 뉴스 아이템만을 반환하게 된다. 이제 남은 일은 대응하는 뷰를 application/views/news/view.php 파일을 만드는 일 뿐이다. 아래의 코드를 이 파일에 추가하자.

<?php

echo '<h2>'.$news_item['title'].'</h2>';

echo $news_item['text'];

?>



라우팅


앞에서 와일드카드를 이용하여 라우팅 규칙을 설정했기 때문에, 지금 만든 컨트롤러를 보기 위해서는 몇가지 라우팅을 추가할 필요가 있다. 라우팅 파일(application/config/routes.php) 파일을 아래와 같이 수정하자. 이렇게 해야만 요청이 pages 컨트롤러로 바로 전달되지 않고, news 컨트롤러로 전달되도록 할 수 있다. 첫 번째 라인에서는 slug를 가지는 URI는 news 컨트롤러의 view 메서드로 전달되도록 라우팅한다.

$route['news/(:any)'] = 'news/view/$1';

$route['news'] = 'news';

$route['default_controller'] = 'pages/view';

$route['(:any)'] = 'pages/view/$1';



  

Posted by socurites

원문: http://ellislab.com/codeigniter/user-guide/tutorial/static_pages.html



제일 먼저 할 일은 정적인 페이지를 처리할 수 있도록 컨트롤러를 설정하는 일이다. 컨트롤러는 단순한 클래스로, 요청을 위임(delegate)한다. 컨트롤러는 웹 어플리케이션에서 컴포넌트를 서로 엮는 일을 담당한다.


예를 들어, 아래와 같은 요청이 있을 때

http://example.com/news/latest/10


CodeIgniter는 news 라는 이름의 컨트롤러가 있으며, news 컨트롤러에는 latest라는 이름의 메서드가 있다고 인식한다.  이 메서드는 아마 10개의 뉴스 아이템을 가져와서, 페이지에 렌더링하는 일을 한다. 일반적으로 MVC 패턴에서, 아래와 같은 형식의 URL을 볼 수 있다.

http://example.com/[controller-class]/[controller-method]/[arguments]


URL 스킴(URL Scheme)이 점점 복잡해지면, 이러한 형식을 바꿔야할 수도 있다. 하지만 지금 당장은 이 정도로도 충분하다.


application/controllers/pages.php 파일을 아래와 같이 생성하자.

<?php


class Pages extends CI_Controller {

    public function view($page = 'home') {

    }

}


?>


즉 "pages"라는 이름킈 클래스를 만들고, view라는 이름의 메서드를 만들어서 $page라는 인자를 받도록 했다. pages 클래스는 CI_Controller 클래스를 상속한다. 따라서 pages 클래스는 CI_Controller 클래스(system/core/Controller.php)에 정의된 메서드와 변수에 접근할 수 있다.


컨트롤러는 웹 어플리케이션에서 이루어지는 모든 요청에 대해 가장 중심적인 역할을 맡는다. 상당히 기술적인 CodeIgniter 토론에서 컨트롤러는 super object라고 불리기도한다. 여타의 php 클래스와 마찬가지로, 컨트롤러는 자신 신을 $this로 참조할 수 있다. $this를 통해서 라이브러리, 뷰를 로드하거나, 프레임워크에 일반적인 명령들을 실행할 수 이다.


첫 번째 메서드를 만들었으니, 이제 기본적인 페이지 템플릿을 만들 차례다. 우리는 두가지 "뷰"(페이지 템플릿)를 만들어서, 페이지 푸터(footer)와 헤더(header)로 사용하려고 한다.


application/views/templates/header.php 파일을 생성한 후, 아래의 코드를 입력하자.

<html>

<head>

    <title><?php echo $title ?> - CodeIgniter 2 Tutorial</title>

</head>

<body>

    <h1>CodeIgniter 2 Tutorial</h1>


헤더는 메인 뷰를 로드하ㅣ전에 표시하려고 하는 코드와 몇가지 heading 요소들을 포함한다. 또한 $title 변수를 출력하는데, 이 변수는 나중에 컨트롤러에 정의할 것이다. 이제 푸터를 application/views/templates/footer.php 파일에 생성하고, 아래의 코드를 입력하자

<strong>&copy; 2011</strong>

<script type="text/javascript">

if (!NREUMQ.f) {

    NREUMQ.f = function() {

        NREUMQ.push(["load", new Date().getTime()]);

        var e = document.createElement("script");

        e.type = "text/javascript";

        e.src = (("http:" === document.location.protocol) ? "http:" : "https:") + "//" + "rpm-images.newrelic.com/42/eum/rum.js";

        document.body.appendChild(e);

        if (NREUMQ.a)

            NREUMQ.a();

    };

    NREUMQ.a = window.onload;

    window.onload = NREUMQ.f;

};

NREUMQ.push(["nrfj", "beacon-3.newrelic.com", "eb488e72a1", "2281554", "NgEEZBYHDUFWVk0KWg9LJUUXEgxfGFZWB1AIAwhZEAMRHUJGXBEYBhEPVAE=", 0, 26, new Date().getTime(), "", "", "", "", ""]); 

</script></body>

</html>



컨트롤러에 로직 추가하기


앞에서 view() 메서드를 가진 컨트롤러를 생성했다. 이 메서드는 하나의 파라미터를 받으며, 이 파라미터는 로드할 페이지의 이름을 값으로 받는다. 정적인 페이지 템플릿은 application/views/pages/ 디렉토리에 위치시킨다. 이 디렉토리에 2개의 파일, home.php와 about.php를 만든다. 그리고 각 파일에 원하는 어떤 내용이든 입력한 후 저장한다. 스스로가 정말 무엇을 써야할지 모르겠다면, 간단히 "Hello World!"라고 입력한다.


이들 페이지를 로드하려면, 요청된 페이지가 실제로 존재하는지 확인해야 한다.

public function view($page = 'home') {

    if (!file_exists('application/views/pages/' . $page . '.php')) {

        // Whoops, we don't have a page for that!

        show_404();

    }


    $data['title'] = ucfirst($page);

    // Capitalize the first letter


    $this -> load -> view('templates/header', $data);

    $this -> load -> view('pages/' . $page, $data);

    $this -> load -> view('templates/footer', $data);

}


페이지가 존재한다면, 헤더와 푸터를 포함해서 페이지가 로드된 후 사용자에게 표시된다. 페이지가 존재하지 않는다면, "404 Page not found" 에러가 보여진다. 


메서드의 첫 라인에서는 페이지가 실제로 존재하는지 확인한다. PHP의 내장 함수인 file_exists()를 사용하여 해당 파일이 원하는 위치에 있는지 검사한다. show_404()는 CodeIgniter 내장 함수로, 디폴트 에러 페이지를 렌더링한다.


헤더 템플릿에서 $title 변수를 사용하여 각 페이지의 타이틀을 달리 표시하였다. $title 변수는 이 메서드에서 정의한다. 단순히 변수에 값을 할당하는 대신에, $data 배열에 title 요소를 할당하는 방식으로 사용한다.


마지막으로 뷰를 출력할 순서대로 로드한다. view() 메서드의 2번쨰 파라미터는 뷰에 값을 전달하기 위해 사용한다. $data 배열의 각 요소는 요소의 키를 변수 이름으로 가지도록 할당된다. 따라서 컨트롤러에서 $data['title']에 값을 할당한 경우, 뷰에서는 $title로 접근할 수 있다.



라우팅(Routing)


컨트롤러는 이제 제대로 동작하게 된다. 브라우저를 열어서 [사이트 url]/index.php/pages/view로 접근하여 페이지에 접근할 수 있다. 

역주). 여기에서는 $page에 해당하는 값을 요청하지 않았으므로, 디폴트 값인 'home'이 사용되어 home.php 파일이 열린다.

그리고 index.php/pages/vies/about으로 접근하면, about 페이지를 볼 수 있다. 물론 이 페이지에서 헤더와 푸터가 포함된다. 


라우팅 규칙을 커스터마이징하게 되면, URI를 원하는 컨트롤러와 메서드에 매핑할 수 있게 되며, 이를 통해 일반적인 매핑 규칙의 제약에서 벗어날 수 있다.

http://example.com/[controller-class]/[controller-method]/[arguments]


위와 같이 접근할 수 있도록 해보자. application/config/routes.php 파일을 열어서, 아래의 2 라인을 추가한다. 그리고 $route 배열에 설정된 나머지 요소를 정의하는 코드는 모두 삭제하자.

$route['default_controller'] = 'pages/view';

$route['(:any)'] = 'pages/view/$1';


CodeIgniter는 라유팅 규칙으로 정의된 규칙을 위에서 차례대로 읽어서 요청에 가장 먼저 매칭되는 규칙을 기반으로 라우팅을 적용한다. 각 규칙은 정규식으로, 컨트롤러 명 / 메서드명으로 매칭된다. 요청이 들어오면 CodeIgniter는 가장 먼저 매칭되는 규칙을 찾고, 그에 맞게 컨트롤러와 메서드를 호출하며, 알맞은 인자를 전달하게 된다.


라우팅과 관련된 더 자세한 정보는 URI Routing 문서에서 찾아볼 수 있다. 


여기에서는 $routes 배열의 두번째 규칙에서 모든 요청을 하나의 와일드 카드 문자열인 (:any)을 사용하여 매칭하도록 했다.  따라서 모든 요청은 pages 클래스의 view() 메서드로 파라미터를 전달하게 된다.


이제 index.php/about으로 접근해보자. pages 컨트롤러의 view() 멧드로 정확하게 라우팅이 되는가? 놀랍지 않은가!


Posted by socurites

원문: http://ellislab.com/codeigniter/user-guide/tutorial/index.html




이 튜토리얼 문서에서는 CodeIgniter 프레임워크를 소개하고, MVC 아키텍처의 기본 개념을 소개한다. 또한 차례대로 따라하면서 기본적인 CodeIgniter 어플리케이션을 개발하는 방법을 설명한다.


이 튜토리얼을 통해서 기본적인 뉴스 어플리케이션을 개발하고자 한다. 먼저 정적인 페이지를 로드할 수 있는 코드를 작성할 것이다. 그런 후에, 데이터베이스로부터 뉴스 아이템을 읽어서 뉴스 섹션을 생성할 것 이다. 마지막으로 데이터베이스에 새로운 뉴스 아이템을 생성할 수 있는 폼(form)을 추가할 것이다.


이 튜토리얼에서는 아래의 내용을 중점적으로 다룬다.

  • Model-View-Controller 클래스
  • 라우팅 소개
  • 폼 검증
  • "Active Record"를 사용하여 기본적인 데이터베이스 쿼리 실행하기


이 튜토리얼은 여러 페이지로 구분하였으며, 각 페이지마다 CodeIgniter 프레임워크의 기능들의 각 요소를 설명한다. 아래의 페이지들을 차례차례 살펴볼 수 있다.

  • 소개
    바로 이 페이지며, 튜토리얼에서 설명할 개략적인 내용을 포함한다.
  • 정적인 페이지
    컨트롤러, 뷰, 라우팅에 대한 기본적인 개념을 설명한다.
  • 뉴스 섹션
    모델을 처음으로 사용하게 되며, 기본적인 데이터베이스와 작업하는 사용법을 익힐 수 있다.
  • 뉴스 아이템 생성하기
    좀더 고급적인 데이터베이스 작업들을 소개하며, 폼 검증 또한 익힐 수 있다.
  • 결론
    추가적인 설명과 자료들에 대한 링크를 담고 있다.

CodeIgniter 프레임워크를 탐험하는 경험을 즐기기를 바란다.



Posted by socurites

아래는 http://www.cikorea.net/user_guide_2.1.0/overview/appflow.html 에서 설명하는 CodeIgniter의 플로우 차트다.


I 동작 개념도 Application Flow Chart

아래 그림은 CI 사용시 데이터의 흐름을 보여줍니다(화살표를 따라가면서 설명을 읽어보세요):

CodeIgniter application flow
  1. The index.php 는 프론트콘트롤러(front controller)로 동작하여 CI가 동작하기 위한 기반리소스들을 초기화 합니다.
  2. 라우터모듈(Routing)은 http 요청을 분석하여 어떤 동작을 해야할지를 결정합니다.
  3. 캐쉬파일이 있다면 그파일을 바로 브라우저로 보내고 일반적인 동작절차는 무시합니다.
  4. 보안모듈(Security)은 프로그램 컨트롤러가 로딩 되기전에 HTTP 요청및 어떤 사용자 전송데이터든지 모두 필터링합니다.
  5. 컨트롤러(Application controller)는 사용자 요청을 처리하기 위해 모델을 로드하고,코어라이브러리,헬퍼 및 필요한 다른 리소스들을 로드 합니다.
  6. 최종적으로 뷰모듈(View)이 렌더링되어 브라우저로 전송됩니다. 캐싱이 활성화 되어이다면 먼저 캐쉬(Cashing)하여 다음번 요청에 사용할 수 있도록 합니다.


Posted by socurites

CodeIgniter 사용자 가이드>설치(http://www.cikorea.net/user_guide_2.1.0/installation/index.html)를 참고하여 설치를 진행한 이력입니다.



따라하기


최신 버전의 CodeIgniter를 다운로드한다.

CodeIgniter를 아파치 웹서버의 DocumentRoot에 압축을 푼다. 나는 ci-test 디렉토리 하위에 풀었다.

application/config/config.php 파일을 열어서 base_url을 아래와 같이 설정한다.

/*

|--------------------------------------------------------------------------

| Base Site URL

|--------------------------------------------------------------------------

|

| URL to your CodeIgniter root. Typically this will be your base URL,

| WITH a trailing slash:

|

|   http://example.com/

|

| If this is not set then CodeIgniter will guess the protocol, domain and

| path to your installation.

|

*/

$config['base_url'] = 'http://localhost/~socurites/ci-test/';


데이터베이스를 사용하려면, application/config/database.php 파일을 열어서 데이터베이스 정보를 입력한다. 내가 사용중인 데이터베이스에 맞게 아래와 같이 수정했다.

$db['default']['hostname'] = '127.0.0.1';

$db['default']['username'] = 'cuser';

$db['default']['password'] = 'cpass';

$db['default']['database'] = 'cake';

$db['default']['dbdriver'] = 'mysql';

$db['default']['dbprefix'] = '';

$db['default']['pconnect'] = TRUE;

$db['default']['db_debug'] = TRUE;

$db['default']['cache_on'] = FALSE;

$db['default']['cachedir'] = '';

$db['default']['char_set'] = 'utf8';

$db['default']['dbcollat'] = 'utf8_general_ci';

$db['default']['swap_pre'] = '';

$db['default']['autoinit'] = TRUE;

$db['default']['stricton'] = FALSE;


설치가 끝났다... 



추가적으로 설정해야할 것들.


암호화나 세션을 사용하려면 application/config/config.php 파일의 encription_key를 설정한다.

/*

|--------------------------------------------------------------------------

| Encryption Key

|--------------------------------------------------------------------------

|

| If you use the Encryption class or the Session class you

| MUST set an encryption key.  See the user guide for info.

|

*/

$config['encryption_key'] = '';


보안을 강화하기 위해서는 system 폴더와 application 폴더의 이름을 변경해야 한다. 변경된 폴더의 이름을 index.php 파일에서 아래 부분을 수정하도록 한다.

/*

 *---------------------------------------------------------------

 * SYSTEM FOLDER NAME

 *---------------------------------------------------------------

 *

 * This variable must contain the name of your "system" folder.

 * Include the path if the folder is not in the same  directory

 * as this file.

 *

 */

    $system_path = 'system';


/*

 *---------------------------------------------------------------

 * APPLICATION FOLDER NAME

 *---------------------------------------------------------------

 *

 * If you want this front controller to use a different "application"

 * folder then the default one you can set its name here. The folder

 * can also be renamed or relocated anywhere on your server.  If

 * you do, use a full server path. For more info please see the user guide:

 * http://codeigniter.com/user_guide/general/managing_apps.html

 *

 * NO TRAILING SLASH!

 *

 */

    $application_folder = 'application';


운영환경이라면, system 폴더와 application 폴더를 브라우저에서 엑세스가 불가능한 위치로 이동시켜야 한다. 더 자세한 보안사항은 보안 클래스를 확인하라고 한다.





Posted by socurites