こんにちわ! NEKOGETです。
この記事はCodeIgniterアドベントカレンダーのために書きました! 8日目です!
https://qiita.com/advent-calendar/2017/code_igniter
7日目の記事はこれ。
Codeigniter3を学ぶための環境をAWS Cloud9で作るの巻 (ansible編)
さて、みんなはCodeIgniter3のチュートリアルは見たことあるかな?
1,2はやったことある。でも3は2と変わらないからやってないわーって人も多いんじゃないかな?
CodeIgniter3のチュートリアルをやりながら、CodeIgniterのコードの話ができるといいかなって思ったんだ。
チュートリアルの場所
本家(英語): https://www.codeigniter.com/user_guide/tutorial/index.html
ユーザー会(日本語): http://codeigniter.jp/user_guide/3/tutorial/index.html
@NEKOGET(日本語?): http://pneskin2.nekoget.com/codeigniter/3/user_guide/tutorial/index.html
今気がついたんだけど、私のやつまだ翻訳終わってなかった….
私ダメじゃん!!!!
とりあえず本家(英語)を見ていこうか☆
チュートリアルの内容
- 静的ページを作ろうぜ
- ニュースを見る機能を作ろうぜ
- ニュースを登録する機能を作ろうぜ
の3本だてだよ!
静的ページを作ろうぜ
https://www.codeigniter.com/user_guide/tutorial/static_pages.html
まぁ、あれだよね。
特に更新はしないんだけど、置いておきたいページあるよね。
ヘッダーとかさ、フッターとかちょっとだけ動的に値をおきたいんだけどメインコンテンツは変更ないし、でも都度都度コードを書き足すのは大変だよねー
こんな書き方があるよっていうご紹介。
チュートリアル的にはデータベースにばーんってつないで、そこから情報をばーんってとってきて、ほら!一連画面が出てきたよ!!!
みたいな方がいいんだろうけど、そうじゃなく静的ページを見せる時にはこんな風に始めるといいよって言っちゃうCodeignier3かわいいよね☆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
< ?php class Pages extends CI_Controller { public function view($page = 'home') { if ( ! file_exists(APPPATH.'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); } } |
チュートリアルにあるコードはこんな感じね。
これだとURLは
http://{CodeIgniterを設置したとこまでのURL}/page/view/{見せたい記事のファイル名}
私が書くとしたら、headerとfooterはもうパーツにしちゃってレイアウトファイルを共通のに作っちゃった上で書くから、こんな感じにしちゃうのが好き。
1 2 |
$this->data['title'] = ucfirst($page); // Capitalize the first letter $this->load->view('layout', $this->data); |
表示したいページをviewの中にどんどん作っていって
view/pages/{ファイル名}.php
ファイル名にHITするものは表示しちゃいましょ。
次に書かれてるのがrouterの設定だね。
application/config/routes.php
1 2 |
$route['default_controller'] = 'pages/view'; $route['(:any)'] = 'pages/view/$1'; |
そうすると、
http://{CodeIgniterを設置したとこまでのURL}/page/view/{見せたい記事のファイル名}
これが
http://{CodeIgniterを設置したとこまでのURL}/{見せたい記事のファイル名}
になるわけですねー
さて、ここで気になると思うんだけど、
$route[‘(:any)’] = ‘pages/view/$1’;
のルールがあって
http://{設置してるURL}/Welcome
にアクセスされたとしますね。
Pages Classのそれと、Welcome Classのどちらが優先されるんだろう?
config/router.php
1 2 3 |
$route['default_controller'] = 'welcome'; $route['404_override'] = ''; $route['translate_uri_dashes'] = FALSE; |
これをこんな風に書きかえたよ。
1 2 3 4 |
$route['default_controller'] = 'pages/view'; $route['(:any)'] = 'pages/view/$1'; $route['404_override'] = ''; $route['translate_uri_dashes'] = FALSE; |
実際試した結果
application/view/welcome.php
の生身が、表示されます。
ではない場合はどうなるんだろう?
Pages classの処理が実行されて、まぁ当たり前なんだけど404です。
ちょっとこれだと苦しいねー苦しいねー
実用的ではないと思うんだー
1 2 3 4 |
$route['default_controller'] = 'Welcome'; $route['document/(:any)'] = 'pages/view/$1'; $route['404_override'] = ''; $route['translate_uri_dashes'] = FALSE; |
http://{設置してるURL}/document/Welcome
こっちの方が使いやすいと思うけど、チュートリアルはこういうものだよーって伝える役割のものなのでこれでいいのかもしれないね。
さて、Router Classはどんなことしてるのか 実際のファイルを見てみようか!
これは、3.1-stableブランチのコードね!
https://github.com/bcit-ci/CodeIgniter/blob/3.1-stable/system/core/Router.php
Router Classは大きな仕事をしてるから、coreフォルダの中にいるんだよ。
で、これがどこで呼ばれて仕事してるかというと、CodeIgniterのcoreの中のCodeIgniter.phpの中でお仕事してます。
https://github.com/bcit-ci/CodeIgniter/blob/3.1-stable/system/core/CodeIgniter.php#L311
次は、「ニュースを見る機能を作ろうぜ」を見てみようね!
ちなみにCodeIgniter4では随分とモダンに高機能になってるよ!
http://pneskin2.nekoget.com/codeigniter/4/user_guide/general/routing.html?highlight=router
次のアドベントカレンダーの記事は ayatoさんの Dockerで作るCodeIgniterローカル開発環境 だよ!
お楽しみに☆