Ian's Archive 🏃🏻

Profile

Ian

Ian's Archive

Developer / React, SpringBoot ...

📍 Korea
Github Profile →
Categories
All PostsAlgorithm19Book1C1CI/CD2Cloud3DB1DesignPattern9ELK4Engineering1Front3Gatsby2Git2IDE1JAVA7JPA5Java1Linux8Nginx1PHP2Python1React9Security4SpatialData1Spring26
thumbnail

Codeigniter 학습

PHP
2021.03.01.

Series

  • 1PHP 기본 문법 정리
  • 2Codeigniter 학습

codeigniter3를 공부해보자

codeigniter3

1. CI 동작

data flow image

  1. index.php CI가 동작하기 위한 기반 리소스 초기화
  2. Router 모듈 동작 결정 2.1) 캐시 파일 존재 -> 캐시 파일 전송
  3. Security 모듈이 Controller로 이동하기 전에 필터링
  4. Controller 사용자 요청 처리
  5. View 모듈 렌더링 -> 전송 (캐시 추가)

CI URL

새그먼트 기반 URL 사용

example.com/news/article/my_article
{호스트 주소}/{호출될 Controller}/{클래스 안의 호출될 Function}/{변수}

2. MVC

  1. Model : 데이터구조 표현, 모델 클래스는 데이터 함수 포함
  2. View : 사용자에게 보여질 화면
  3. Controller : Model과 View사이 동작

Controller

URL과 상호작용하는 클래스 파일

특징

  • 클래스 명은 항상 대문자로 시작

추가로 알아야 될 사항

1. Controller에 나오는 _의 의미

Controller에서 _를 함수 이름 앞에 작성하면 Routing되지 않는다. (private한 메소드가 된다.)

2. $this, self, -> 차이

참고 블로그

3. _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();
}

컨트롤러가 _remap()함수 가지고 있으면 무조건 호출된다

4. _output() 함수

추가로 알아야 될 사항은 내용은 내용을 조금 더 추가 할 예정이다.

Route

application/config/routes.php에 작성

View

화면에 출력되는 부분

Model

Model은 데이터를 가져오는 로직을 메소드로 정의, Controller를 통해 사용된다.

데이터 베이스 설정

Application/config/database.php 파일을 수정

파일 속성

hostname : 데이터베이스 서버의 주소 (localhost는 PHP와 같은 머신을 의미)
username : 데이터베이스 사용자의 이름
password : 데이터베이스 비밀번호
database : 데이터베이스 명
dbdriver : 데이터베이스의 종류로 지원되는 드라이브의 목록은 system/database/drivers 디렉토리명을 참고한다.

데이터 베이스 라이브러리 로드

PHP에서 MySQL을 사용하기 위해 mysqli를 설치한다

복사
$ sudo apt-get install php-mysqli

데이터 베이스 라이브러리 로드 방법은 2가지가 있다.

1. application/config/autoload.php 파일의 $autoload['libraries'] 배열에 'database'를 추가한다.
2. controller 내에서 $this->load->database()를 호출한다.

Model 파일 생성 규칙

  • application/models/{모델 명_model}.php 형식으로 생성
  • 파일은 CI_Model 클래스 상속
  • 클래스 명은 대문자로 시작

Model load

  1. Model load

    $this->load->model(‘소문자로된 모델 클래스 명’);

ex)

$this->load->model('topic_model');
  1. Model call

    모델 클래스 명 -> 메소드 명

ex)

$topics = $this -> topic_model -> gets();

Model 내 쿼리 사용

$this->db 이용!

  • 사용 예제
복사
$query - $this->db->query('SELECT name, title, email FROM my_table')

foreach($query->result() as $row) {
   echo $row->title;
   echo $row->name;
   echo $row->email;
}

echo 'Total Results: ' . $query->num_rows();

결과 불러오기

객체 배열 리턴한다.

  1. 다중 결과(객체)
    • result()
  2. 다중 결과(배열)
    • result_array()
  3. 단일 결과(객체)
    • row()
  4. 단일 결과(배열)
    • row_array()

Tip!!

복사
if (!-e $request_filename ) {
	rewrite ^(.*)$ /index.php last;
}

file이 존재하지 않으면, index.php로 이동

?> 닫는 태그를 생략하는 경우

PHP 구문은 기본적으로

복사
<?php
  ...
?>

위와 같이 구성된다. 문장의 종료는 반드시 세미 콜론이 찍혀야 한다.

하지만 php코드를 보면 닫는 코드인 ?> 을 생략한 구문이 있다. 이상하게 코드는 잘 동작한다.

그 이유를 알아보면 순수 PHP코드로만 이루어진 코드는 닫는 태그를 생략하는 것이 더 유리하다고 한다.

왜냐하면 닫는 태그인 ?> 앞 뒤에 공백이나 Enter가 실수로 들어가는 경우가 많기 때문이다.

이런 상황에는 의도하지 않은 에러가 날 수 있고, 디버깅 하기 힘듬

하지만 HTML 코드와 같이 사용할 경우에는 반드시 사용해야 한다.

3. Library, Helper

Helper

자주 사용하는 로직을 재활용 할 수 있게 만드는 Library

Library vs Helper

Helper : 일반적인 함수로 만들어짐 / Library : 객체로 만들어짐

  1. 기본적인 로드 방법
복사
$this->load->helper('헬퍼 이름')
  1. 복수의 헬퍼를 로드하기 위한 방법
복사
$this->load->helper(array('헬퍼1의 이름', '헬퍼2의 이름'));

Tip!!

헬퍼는 보통 직접적으로 스크립트를 실행하는 경우가 많이 없으므로

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

구문을 상단에 최상단에 추가하여 스크립트의 실행을 막는다.

Library

웹개발에서 자주 사용되는 로직을 내장(Core) 라이브러리로 제공하고 있다.

4. CI Config

필요에 따라 Application 동작 방법을 변경한다. Application/config/ 디렉토리 아래에 위치

Tip!! 개발환경과 실서비스 환경과 설정을 다르게 위해 index.php의

복사
define('ENVIRONMENT', 'development');

두 번째 인자값을 development, testing / production 으로 바꿀 수 있지만 dev.php를 하나 더 만들어서 접속 경로를 다르게 하는 방법도 있음

development : 개발 환경에서 사용한다. 모든 에러가 출력된다.
testing, production : 테스팅이나 실서비스 환경에서 사용된다. 에러가 출력되지 않는다.

1. config.php

CI에 필요한 기본적인 설정파일 / CI가 동작하는 방식에 대한 다양한 설정 값이 저장되어 있음.

파일을 보면 쿠키, 세션, 보안, 캐시파일/로그파일 저장 위치 같은 것을 확인할 수 있다.

2. database.php

database에 필요한 설정파일

3. autoload.php

Helper, Library같은 리소스들을 자동 로드 -> 편의성 증대 / 성능 감소 주의

4. hooks.php

사용자가 Core의 기본 실행 흐름을 설정 가능 (자신만의 로직 추가 가능 / config.php에서 설정 해야지 사용 가능)

설정 정보 사용

config 라이브러리와 config.php 파일은 자동 로딩하기 때문에 별도 작업 필요 없음

복사
$this->config->item('base_url');

사용자 정의 설정

$config 배열에 값 추가, 파일을 통한 설정 값 추가 가능(로딩 절차 필요)

복사
$this->load->config('hsh');
// file을 통한 설정 load
$this->config->item('hsh');
// item 메소드는 설정이 없으면 false 리턴

5. CI debugging / log

application/config/config.php에 보면

복사
$config['log_threshold'] = 0;

구문 수정을 통해 log수준을 설정할 수 있다.

0 = 로깅을 비활성화
1 = 에러로그만 기록
2 = 디버그 로그도 기록
3 = 정보 로그도 기록
4 = 모든 메시지를 기록

controller에서 아래와 같이 사용하면 원하는 log메세지를 추가 할 수 있다.

복사
// debug 메세지 추가
log_message('debug', 'topic 초기화');

// error 메세지 추가
log_message('error', 'topic의 값이 없습니다');

6. 파일 처리

Upload 클래스의 doupload가 핵심 메소드

현재 다니고 있는 회사에선 file upload는 Fine-Uploader를 사용하고
CKEditor를 사용해서 HTML 코드 없이 글을 작성하는 기능을 구현했다.

7. Core 확장

CI는 코어 상속, Hook방법을 통해 Core기능

경로에 index.php 없애기

  1. application/config/config.php
복사
$config['index_page'] = '';

index.php를 찾아서 빈 값으로 설정한다

  1. index.php가 존재하는 폴더에 .htaccess파일을 추가한다. (Permisson은 755로 설정한다.)

.htaccess 파일

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
Previous Post
SQLite 정리
Next Post
git branch 전략
Thank You for Visiting My Blog, I hope you have an amazing day 😆
© 2023 Ian, Powered By Gatsby.