「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜
-
Upload
makoto-kaga -
Category
Technology
-
view
2.000 -
download
1
description
Transcript of 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜
「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