「code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

Post on 06-Jul-2015

2.001 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

2011年2月19日(土)に東京で開催された「CodeIgniterカンファレンス2011 (CodeIgniter Con 2011, Tokyo Japan)にてプレゼンテーションした内容です。http://cicon.codeigniter.jp/2011/主にCodeIgniter 2.0.0で、ソースを読むメリット、拡張のしかたの概要を述べています。

TRANSCRIPT

「CodeIgniter」を読もう。~ソースコードから知る仕様や拡張方法~

加賀 誠人@makotokagaproject92.com

この作品はクリエイティブ・コモンズ 表示 - 非営利 - 継承 2.1 日本 ライセンスの下に提供されています。

about me

•加賀 誠人 (かが まこと)

about me

•加賀 誠人 (かが まこと)• @makotokaga

about me

•加賀 誠人 (かが まこと)• @makotokaga • http://project92.com

about me

•加賀 誠人 (かが まこと)• @makotokaga • http://project92.com• フリーランスのウェブエンジニア

about me

•加賀 誠人 (かが まこと)• @makotokaga • http://project92.com• フリーランスのウェブエンジニア• PHPとの出会いはPHP/FI 2.0のころ

about me

•加賀 誠人 (かが まこと)• @makotokaga • http://project92.com• フリーランスのウェブエンジニア• PHPとの出会いはPHP/FI 2.0のころ• CodeIgniter歴は4カ月ほど

CodeIgniterのソースコードを読むべき3つの理由

CodeIgniterのソースコードを読むべき3つの理由•細かい振る舞いを理解できる

CodeIgniterのソースコードを読むべき3つの理由•細かい振る舞いを理解できる• CodeIgniterを拡張するには理解するところから

CodeIgniterのソースコードを読むべき3つの理由•細かい振る舞いを理解できる• CodeIgniterを拡張するには理解するところから•コンパクトだから読むのが簡単

CodeIgniterのソースコードを読むべき3つの理由•細かい振る舞いを理解できる• CodeIgniterを拡張するには理解するところから•コンパクトだから読むのが簡単

ソースを使え、ルーク!Use the Source, Luke!

Evil Preacher / http://predicadormalvado.blogspot.com/Illustration by

主要フレームワークとの行数の比較

0 250,000 500,000 750,000 1,000,000

43,044

45,439

190,022

300,891

468,480

949,707

CodeIgniter 1.7.3

CodeIgnter 2.0.0

CakePHP 1.3.7

symfony 1.4.9

Zend Framework 1.11.3 Minimal

Zend Framework 1.11.3 Full

主要フレームワークとの行数の比較

•配布パッケージ中の *.php ファイルの行数を集計•コメント行や空行を含みます

コンパクトということは……

コンパクトということは……

• CodeIgniterは機能がシンプル• お仕着せでないよさ

コンパクトということは……

• CodeIgniterは機能がシンプル• お仕着せでないよさ•マニュアル(User Guide)を読むのに多くの時間を要さない

コンパクトということは……

• CodeIgniterは機能がシンプル• お仕着せでないよさ•マニュアル(User Guide)を読むのに多くの時間を要さない•ソースを読んで深く理解するのにも多くの時間を要さない• すぐに使いこなせるツールとなる

細かい振る舞いを理解できる

•例題1 Template Parser Classで、

とした場合の振る舞いってどうなるのか?

{entries}...{/entries}{entries}...{/entries}

細かい振る舞いを理解できる

•例題1 Template Parser Classで、

とした場合の振る舞いってどうなるのか?• ドキュメントには書かれてないが、ソースを読めば一目瞭然

{entries}...{/entries}{entries}...{/entries}

CodeIgniterを拡張するには、理解するところから•標準の機能がシンプルであるため、CodeIgniterの機能を拡張することは、特別なことじゃない!

ディレクトリ構成~ 1.7.3以前と2.0.0以降の違い

ディレクトリ構成~ 1.7.3以前と2.0.0以降の違い•おおきく整理され理解しやすくなった

ディレクトリ構成~ 1.7.3以前と2.0.0以降の違い•おおきく整理され理解しやすくなった• 標準ではsystemディレクトリの配下にあったapplicationディレクトリは、systemディレクトリと同階層に

ディレクトリ構成~ 1.7.3以前と2.0.0以降の違い•おおきく整理され理解しやすくなった• 標準ではsystemディレクトリの配下にあったapplicationディレクトリは、systemディレクトリと同階層に• コアクラスとその他のライブラリのディレクトリが分離された

CodeIgniter 2.0.0のディレクトリ構成

CodeIgniter 2.0.0のディレクトリ構成

index.php

system

application

CodeIgniter 2.0.0のディレクトリ構成

core

database

libraries

helpers

index.php

system

application

CodeIgniter 2.0.0のディレクトリ構成

core

database

libraries

helpers

index.php

system

application

configcontrollers

viewsmodels

CodeIgniter 2.0.0のディレクトリ構成

core

database

libraries

helpers

core

libraries

helpers

index.php

system

application

configcontrollers

viewsmodels

CodeIgniterの起動時の動きを追う①• フロントコントローラ「index.php」

CodeIgniterの起動時の動きを追う①• フロントコントローラ「index.php」• 最初に呼び出され実行される

CodeIgniterの起動時の動きを追う①• フロントコントローラ「index.php」• 最初に呼び出され実行される• system/applicationディレクトリのパスを決定

CodeIgniterの起動時の動きを追う①• フロントコントローラ「index.php」• 最初に呼び出され実行される• system/applicationディレクトリのパスを決定• ファイルパスについての定数の定義

CodeIgniterの起動時の動きを追う①• フロントコントローラ「index.php」• 最初に呼び出され実行される• system/applicationディレクトリのパスを決定• ファイルパスについての定数の定義• core/CodeIgniter.phpへ処理を引き継ぐ

CodeIgniterの起動時の動きを追う①• フロントコントローラ「index.php」• 最初に呼び出され実行される• system/applicationディレクトリのパスを決定• ファイルパスについての定数の定義• core/CodeIgniter.phpへ処理を引き継ぐ

• このファイルだけはDocumentRoot以下に置く必要がある

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

SELF フロントコントローラのファイル名。通常は「index.php」

EXT PHPファイルの拡張子BASEPATH systemディレクトリの絶対パスAPPPATH applicationディレクトリのパス

FCPATH フロントコントローラのあるディレクトリの絶対パス

SYSDIR systemディレクトリの名前。通常は「system」

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

SELF フロントコントローラのファイル名。通常は「index.php」

EXT PHPファイルの拡張子BASEPATH systemディレクトリの絶対パスAPPPATH applicationディレクトリのパス

FCPATH フロントコントローラのあるディレクトリの絶対パス

SYSDIR systemディレクトリの名前。通常は「system」

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

SELF フロントコントローラのファイル名。通常は「index.php」

EXT PHPファイルの拡張子BASEPATH systemディレクトリの絶対パスAPPPATH applicationディレクトリのパス

FCPATH フロントコントローラのあるディレクトリの絶対パス

SYSDIR systemディレクトリの名前。通常は「system」

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

SELF フロントコントローラのファイル名。通常は「index.php」

EXT PHPファイルの拡張子BASEPATH systemディレクトリの絶対パスAPPPATH applicationディレクトリのパス

FCPATH フロントコントローラのあるディレクトリの絶対パス

SYSDIR systemディレクトリの名前。通常は「system」

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

SELF フロントコントローラのファイル名。通常は「index.php」

EXT PHPファイルの拡張子BASEPATH systemディレクトリの絶対パスAPPPATH applicationディレクトリのパス

FCPATH フロントコントローラのあるディレクトリの絶対パス

SYSDIR systemディレクトリの名前。通常は「system」

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

SELF フロントコントローラのファイル名。通常は「index.php」

EXT PHPファイルの拡張子BASEPATH systemディレクトリの絶対パスAPPPATH applicationディレクトリのパス

FCPATH フロントコントローラのあるディレクトリの絶対パス

SYSDIR systemディレクトリの名前。通常は「system」

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御• Common.phpのロード

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御• Common.phpのロード• コアシステムクラスのロード

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御• Common.phpのロード• コアシステムクラスのロード• constants.php、config.phpの読み込み

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御• Common.phpのロード• コアシステムクラスのロード• constants.php、config.phpの読み込み• アプリケーションControllerのロードと実行

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御• Common.phpのロード• コアシステムクラスのロード• constants.php、config.phpの読み込み• アプリケーションControllerのロードと実行• フックの実行

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御• Common.phpのロード• コアシステムクラスのロード• constants.php、config.phpの読み込み• アプリケーションControllerのロードと実行• フックの実行• 必要ならDB接続のクローズ

CodeIgniterの起動時の動きを追う④• system/core/Common.php

CodeIgniterの起動時の動きを追う④• system/core/Common.php• CodeIgniterの実行に必要な関数を定義する

CodeIgniterの起動時の動きを追う④• system/core/Common.php• CodeIgniterの実行に必要な関数を定義する• &load_class()

CodeIgniterの起動時の動きを追う④• system/core/Common.php• CodeIgniterの実行に必要な関数を定義する• &load_class()• ファイルからクラスをロード

CodeIgniterの起動時の動きを追う④• system/core/Common.php• CodeIgniterの実行に必要な関数を定義する• &load_class()• ファイルからクラスをロード• &get_config()

CodeIgniterの起動時の動きを追う④• system/core/Common.php• CodeIgniterの実行に必要な関数を定義する• &load_class()• ファイルからクラスをロード• &get_config()• config.phpを読み込み

CodeIgniterの起動時の動きを追う④• system/core/Common.php• CodeIgniterの実行に必要な関数を定義する• &load_class()• ファイルからクラスをロード• &get_config()• config.phpを読み込み• などなど

CodeIgniterの起動時の動きを追う⑤• system/core/CodeIgniter.phpがロードするコアクラスCI_Benchmark 実行速度を計測するCI_Hooks フックの機能を提供CI_Config 設定ファイルの読み込みCI_Utf8 UTF-8サポートCI_URI URIの操作CI_Router URIのルーティングCI_Output 出力の制御

CI_Input POST、COOKIE、SERVERデータの取得や、XSSフィルタなど

CI_Lang メッセージの国際化

CodeIgniterの起動時の動きを追う⑥•ロードされたコアクラスは、CI_Controllerのコンストラクタでメンバ変数に設定される• コントローラ内で、以下のようにアクセスできる$this->output->set_header();

CodeIgniterの起動時の動きを追う⑦• system/core/CodeIgniter.phpが読み込むファイル

• CI_Controllerのコンストラクタがロードするクラス

CI_Controller アプリケーションControllerの基底クラス(core/Controller.php)

CI_Loader ViewやModel、database、ヘルパー、ライブラリを読み込む

$this->load->view('welcome_message');

アプリケーションコントローラからアクセスできるコアクラスCI_Benchmark $this->benchmark

CI_Hooks $this->hook

CI_Config $this->config

CI_Utf8 $this->utf8

CI_URI $this->uri

CI_Router $this->router

CI_Output $this->output

CI_Input $this->input

CI_Lang $this->lang

CI_Loader $this->load

CI_Log $this->logコアクラスではないが、ログを有効にすると以下もロードされる

CodeIgniterの拡張手段

CodeIgniterの拡張手段

•フック

CodeIgniterの拡張手段

•フック•コアクラスのカスタマイズ

CodeIgniterの拡張手段

•フック•コアクラスのカスタマイズ•標準ライブラリ、ヘルパのカスタマイズ

CodeIgniterの拡張手段

•フック•コアクラスのカスタマイズ•標準ライブラリ、ヘルパのカスタマイズ•ライブラリ、ヘルパの追加

CodeIgniterの拡張手段

•フック•コアクラスのカスタマイズ•標準ライブラリ、ヘルパのカスタマイズ•ライブラリ、ヘルパの追加•ドライバ

コアシステムクラスを拡張する

コアシステムクラスを拡張する

• 完全に置き換えることも、継承して拡張することも可能。• いずれも application/core/ にファイルを置く

コアシステムクラスを拡張する

• 完全に置き換えることも、継承して拡張することも可能。• いずれも application/core/ にファイルを置く

• コアクラスを置き換える場合• 「CI_」で始まるクラス名

コアシステムクラスを拡張する

• 完全に置き換えることも、継承して拡張することも可能。• いずれも application/core/ にファイルを置く

• コアクラスを置き換える場合• 「CI_」で始まるクラス名• コアクラスを拡張する場合• 「MY_」で始まるクラス名• 「CI_」で始まるクラスを継承

コアクラスを置き換える

• CI_Outputを置き換える場合• system/core/Output.phpを削除• バグ? or 仕様? ~1.7.3と違う• application/core/Output.php

• CI_Controllerは置き換えできない

コアクラスを置き換える

• CI_Outputを置き換える場合• system/core/Output.phpを削除• バグ? or 仕様? ~1.7.3と違う• application/core/Output.php

• CI_Controllerは置き換えできない

<?phpclass CI_Output { function __construct() { ... }}

コアクラスを拡張する

•たとえば、CI_Controllerを拡張する場合• application/core/MY_Controller.php

コアクラスを拡張する

•たとえば、CI_Controllerを拡張する場合• application/core/MY_Controller.php<?php

class MY_Controller extends CI_Controller {

function __construct() {

parent::__construct();

}

}

ライブラリを拡張する

ライブラリを拡張する

•基本的にコアクラスと同じ

ライブラリを拡張する

•基本的にコアクラスと同じ• 置き換えるか拡張するか

ライブラリを拡張する

•基本的にコアクラスと同じ• 置き換えるか拡張するか• 置き換える場合、単にapplication/libraryにファイルを置けばよい

ライブラリを拡張する

•基本的にコアクラスと同じ• 置き換えるか拡張するか• 置き換える場合、単にapplication/libraryにファイルを置けばよい• system/coreに同名ファイルが残ってても無視される

宣伝!

宣伝!

• PostgreSQL Conference 2011

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!• 10:00~17:40

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!• 10:00~17:40• AP品川 (品川駅高輪口 徒歩3分)

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!• 10:00~17:40• AP品川 (品川駅高輪口 徒歩3分)• 主催: 日本PostgreSQLユーザ会(JPUG)

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!• 10:00~17:40• AP品川 (品川駅高輪口 徒歩3分)• 主催: 日本PostgreSQLユーザ会(JPUG)• 参加費 3,500 円(懇親会は別途 3,500 円)

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!• 10:00~17:40• AP品川 (品川駅高輪口 徒歩3分)• 主催: 日本PostgreSQLユーザ会(JPUG)• 参加費 3,500 円(懇親会は別途 3,500 円)

• チケット販売 ~2月25日

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!• 10:00~17:40• AP品川 (品川駅高輪口 徒歩3分)• 主催: 日本PostgreSQLユーザ会(JPUG)• 参加費 3,500 円(懇親会は別途 3,500 円)

• チケット販売 ~2月25日 http://www.postgresql.jp

The Source will be with you, always.

@makotokagahttp://project92.com

top related