チュートリアル
チュートリアル ルーティング
0前 チュートリアル RestコントローラとHybridコントローラ
おはようございます。ゆう☆きんです。
今回はルーティングについて説明したいと思います。
FuelPHPでは fuel/app/config/routes.php を編集することでルーティング設定が行えます。
では、どのように編集すればいいのか見て行きましょう。
※ルーティングについての説明はURLを多用し、非常にめんどいので http://localhost/fuelphp ではなく http://example/ とします。
基本的なルーティング
1 2 3 4 5 |
<?php return array( 'login' => 'user/login', ) |
この場合、 http://example/user/login ではなく http://example/login でアクセスできるようになります。
予約済みのルート
fuel/app/config/routes.php を見て下さい。
_root_ と _404_ が設定されていますが、これはFuelPHPであらかじめ定義されている特殊なルートです。
_root_ は http://example/ にアクセスしたときにルートです。
つまりサイトのトップページです。
_404_ は コントローラやメソッドがなかったときのルートです。つまり 404 Not Found 用のルートです。
正規表現によるルーティング
ルーティング設定では正規表現も使えます。正規表現の説明は省きます。
また正規表現以外にも、以下のようなものが使えます。
文字列 | 意味 | 実際の正規表現 |
---|---|---|
:any | URIの任意の部分にマッチ | .+ |
:segment | URIの1つのセグメントにマッチ | [^/]* |
:num | 数字にマッチ | [[:digit:]]+ |
:alpha | 文字にマッチ | [[:alpha:]]+ |
:alnum | 文字と数字にマッチ | [[:alnum:]]+ |
これだけ書くとちょっと意味わかんないんでサンプル。
1 2 3 4 5 6 7 8 9 10 |
<?php return array( '_root_' => 'welcome/index', // The default route '_404_' => 'welcome/404', // The main 404 route 'yugi/(:any)' => 'sample/shodai/$1', // (1) '(:segment)/judai' => 'sample/gx/$1', // (2) '{:num}/yusei' => 'sample/5ds/$1', // (3) ); |
この場合、 http://example/yugi/hitode で(1)にルーティングされます。
ルーティング処理は上から順に実行されます。
なので、 http://example/yugi/judai でも(2)ではなく(1)にルーティングされるので注意です。
http://example/haou/judai の場合は(2)に、 http;//example/123/yusei の場合は(3)にそれぞれルーティングされます。
ここからは高度なルーティングについて説明します。
名前付きパラメータ
名前付きパラメータとは、URIのセグメントに名前を付けるものです。
パラメータは : (コロン)を付けることで表せます。また、パラメータ名に数字を使うことができません。
というわけでサンプル。
1 2 3 4 5 6 7 8 9 10 |
<?php return array( '_root_' => 'welcome/index', // The default route '_404_' => 'welcome/404', // The main 404 route 'cal/:year/:month/:day' => 'sample/cal', // (1) 'cal/:year/:month' => 'sample/cal', // (2) 'cal/:year' => 'sample/cal', // (3) ); |
例えば、 http://example/cal/1988/12/26 で(1)にルーティングされます。
この際、コントローラでは $this->param(‘year’); $this->param(‘month’); $this->param(‘day’); を使って各パラメータの数値を取得できます。
http://example/cal/2013 の場合は(4)になり、 $this->param(‘year’); のみ使用可能になるという感じです。
ここで注意ですが、セグメントの多い順から設定しないと http://example/2013/01/18 で cal/year にマッチしてしまう場合があるので、注意してください。
あ、ちなみに最初の日付は私の誕生日です。祝ってくれてもいいんですよ?
HTTPメソッドの使用
サンプル。
1 2 3 4 5 6 7 8 9 10 11 |
<?php return array( '_root_' => 'welcome/index', // The default route '_404_' => 'welcome/404', // The main 404 route 'sample/(:any)' => array( array('GET', new Route('data/get/$1')), array('POST', new Route('data/post/$1')) ), ); |
http://example/sample/abc にGETでアクセスすれば http://example/data/get/abc にルーティングされ、
http://example/sample/abc にPOSTでアクセスすれば http://example/data/post/abc にルーティングされます。
つまりそういうことです。
名前付きルート
サンプル。
1 2 3 4 5 6 7 8 |
<?php return array( '_root_' => 'welcome/index', // The default route '_404_' => 'welcome/404', // The main 404 route 'rasta/yukin' => array('yukin/index', 'name' => 'yukin'), // (1) ); |
この場合、 http://example/yukin/index にアクセスすると http://example/yukin/index にルートされます。
そして、そのルートに対して yukin という名前を付けていることになります。
これで何が出来るかというと、 Router::get(‘ルート名’); でURLを生成できるようになるので、下記のようなことが可能です。
1 2 3 4 5 6 7 8 9 10 11 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>リンクの生成</title> </head> <body> <?php echo Html::anchor(Router::get('yukin'), 'ゆうきんのページ'); ?> </body> </html> |
Html::anchor とはリンクを生成するメソッドです。
第1引数でURLを指定し、第2引数でリンク名を指定します。
この場合、 Router::get(‘yukin’) で生成したURLを渡してるわけです。
このようにすることが可能ですので、例えば rasta/yukin から rasta/member/yukin にしたいなぁとなったとき、
ルーティング設定だけ更新すればいいので、ビューを弄る必要がありません。
同じURLを複数のビューでリンクするとき、複数のビューを直す手間が省けます。
名前付きルートを使用するときの注意ですが、正規表現や名前付きパラメータが使用出来ません。※現在 FuelPHP 1.2
以上でルーティング設定の説明を終わります。
コントローラ名/メソッド名で生成されるURLだけでは限界があるので、是非活用して下さい。
では、おやすみなさい。
チュートリアル RestコントローラとHybridコントローラ
0
おはようございます。かつてゆうきんと呼ばれていたものです。
今回は、規約その2 コントローラ編で規約だけ説明したRestコントローラとHybridコントローラの説明をします。
Restコントローラについて
以前書きましたが、RestコントローラとはHTTPメソッドをサポートするものです。
主に POST や GET ですね。
習うより慣れろということで、さっそくサンプルをドン。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php class Controller_Input extends Controller_Rest { public function get_data() { $this->response( array( 'name' => 'yukin', 'age' => 24 ) ); } } |
GETメソッドだけ存在するRestコントローラサンプルです。
http://localhost/fuelphp/input/data.json にアクセスすると私の個人情報が漏洩します。ヤダ怖い。
通常のGETメソッドと同じ用に値を渡す事もできます。
例えば http://localhost/fuelphp/input/data.json?name=yukin&age=24 という具合です。
これに対応するRestコントローラは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php class Controller_Input extends Controller_Rest { public function get_data() { $this->response( array( 'name' => Input::get('name'), 'age' => Input::get('age') ) ); } } |
アクセスした時の見た目は変わりませんが、渡された値を返すようになっています。
先ほどのURLの yukin と 24 の部分をいじってアクセスしてみて下さい。実感できるかと思います。
Restコントローラ単体ではページの表示には向きません。
主にWebサービスを作成する場合に用いることになるでしょう。
Hybridコントローラについて
PHPは多重継承が許されていません。
では、RestコントローラとTemplateコントローラを同時に使いたい場合はどうするのでしょうか?
それを解決してくれるのが、Hybridコントローラです。
RestコントローラとTemplateコントローラの特性を同時に持たせたい場合はHybridコントローラを継承するのです。
ファイルを分割することでも解決可能ですが、それだとURLもわかれてしまい、ユーザにわかりにくくなってしまう場合があります。
例えばログインページを作成するときなどはHybridコントローラを使うことになるかと思います。
anction_index で入力画面を表示 post_login でポストされたデータをチェックし、正しければログイン処理を実行する、などです。
覚えておくと非常に便利なものなので、有効活用して下さい。
では、おやすみなさい。
チュートリアル Templateコントローラ
0次 チュートリアル RestコントローラとHybridコントローラ
おはようございます。ゆうきんのようなものです。
前回、HelloWorldを作って基本的なページの作り方を覚えました。
しかし、まだまだ安心してはいけません。ここからが本当の地獄だ・・・。
今回はTemplateコントローラについて説明します。
Webサイトって左に表示されるメニューとか、上部に表示されてるタイトルとか、ページを遷移しても変わらないページがありますよね?
その変わらない部分と変わる部分を切り離し、ビューとして作成し管理するのがTemplateコントローラです。
他の使い方もありますが、私は主にこの方法で使用します。
違う使い方でも覚えることは一緒なので安心して下さい。
まずはTemplateコントローラの規約をまとめます。
Templateコントローラの規約
- Controller_Templateクラスを継承する
- デフォルトレイアウトファイル(テンプレートファイル)は fuel/app/views/template.php である
- $this->template にテンプレートファイルのビューオブジェクトが自動的に代入される
- アクションメソッドでは自動的にビューオブジェクトが返される
- デフォルトテンプレートを使いたくなければ $this->template に違うビューを入れれば良い
- beforeメソッドを使う場合は必ずparent::before() を呼び出す
以上です。新しい単語とかいろいろ出てきてなんのこっちゃと思うでしょうが、きちんと説明します。
デフォルトレイアウトファイル(テンプレートファイル)とは、表示したいビューをはめ込んでいくビューです。
なんか意味わかんないですね。多分見たほうが早いです。というわけでほい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title><?php echo $title ?></title> </head> <body> <div id="header"> <?php echo $header ?> </div> <div id="content"> <?php echo $content ?> </div> <div id="footer"> <?php echo $footer ?> </div> </body> </html> |
これがテンプレートファイルです。これは簡単なものです。もちろん作りたいページによって変化します。
あ、でも簡単なものでも難しいものでも、規約通り template.php という名前で fuel/app/views に配置してくださいね。
そこに配置したものがデフォルトレイアウトファイルとして認識されますから。
そして、テンプレートコントローラの $title, $header, $content, $footer にコントローラで生成したビューオブジェクトや、文字列をはめ込んで、表示したいページを作っていくわけです。
というわけでTemplateコントローラのサンプルも載せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?php /** * サンプルクラス */ class Controller_Sample extends Controller_Template { /** * アクションメソッドを実行する前に処理される */ public function before() { // 必ず親クラスのbefore()メソッドを実行する parent::before(); // header と footer を指定 $this->template->header = View::forge('header'); $this->template->footer = View::forge('footer'); } /** * 挨拶1 */ public function action_hello1() { // ビューファイル全体に$titleをセットする $this->template->set_global('title', '挨拶1'); // コンテンツを生成しはめ込む $this->template->content = View::forge('hellos/hello1'); } /** * 挨拶2 */ public function action_hello2() { // ビューファイル全体に$titleをセットする $this->template->set_global('title', '挨拶2'); // コンテンツを生成しはめ込む $this->template->content = View::forge('hellos/hello2'); } } |
このファイルはコントローラなので、fuel/classes/controller に配置します。
$this->template とはさっき作ったテンプレートファイルのビューオブジェクトです。
指定も生成もしてないじゃんと思うかもしれませんが、規約でも少し触れたように、デフォルトレイアウトファイルは自動で読み込まれるので、特に意識しなくても大丈夫です。
むしろきちんとデフォルトレイアウトファイルを用意しないと面倒くさいので、きちんと用意するのをオススメします。
注意事項ですが、規約にもあるとおり、Templateコントローラで beforeメソッドを使用する場合、必ず parent::before() を呼び出して下さい。でないと、エラーが出ます。
お気づきでしょうが、$this->template->header がテンプレートファイルで用意した $header です。
$this->template->header = View::forge(‘header’) というようにテンプレートファイルに生成したビューオブジェクトをはめ込んでいきます。
余談ですがビューに渡す変数がなければ、第2引数は省略可能です。
そして、 $title に値をセットして、 content にビューオブジェクトをはめ込んでいます。
規約にも書きましたが、Templateコントローラのアクションメソッドでは自動的にビューオブジェクト、つまり $this->template が返されるので、明示的に書く必要がありません。
$title に値をセットするとき set_global というメソッドを使っていますが、またの機会に詳しく書きます。
簡単に説明すると、 set_global で値をセットすると全てのビューオブジェクトで使用可能になる、というものです。
生成するビューのサンプルも載せておきます。
1 2 3 |
<div> <p>挨拶をしよう</p> </div> |
1 2 3 |
<div> <p>挨拶終わり</p> </div> |
1 2 3 |
<div> <p>おはようございます</p> </div> |
1 2 3 |
<div> <p>おやすみなさい</p> </div> |
決して手抜きではありません。・・・決して手抜きではありません。大事な事なので2回言いました。
hello1 と hello2 は fuel/app/views に hellos というフォルダを作って配置してありますので、ご注意を。
全てのファイルが用意できたら、 http://fuelphp/sample/hello1 と http://fuelphp/sample/hello2 にアクセスしてみて下さい。
最初と最後の文章は変わらずに、中央の挨拶だけが変わる手抜きのページが見れると思います。
以上が、Templateコントローラの概要と作り方です。
かなり、簡単なページで説明しましたが、使いこなすととんでもなく作業量を減らすことが出来る大変便利なものです。
近代的なページのようなレイアウトにしたければ javascript と css を多用することになるのはFuelPHPでも一緒ですが、私は一切説明するつもりはありません!
では、おやすみなさい。
チュートリアル HelloWorldを作る
0
おはようございます。ゆうきんかも知れません。
前回まではFuelPHPの規約について説明しました。
でも、それだけだと何をどうしたらいいのかわからないと思うので、簡単なページの作成を行いたいと思います。
ではまず、ビューを作成します。
fuel/app/views に hello.php というファイルを作ります。
中身は以下の通りです。
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title><?php echo $title ?></title> </head> <body> <p>Hello World!</p> </body> </html> |
<title><?php $title ?></title> の部分はphpのコマンドを使って$titleの中身を表示しているというものです。
そのままですね。ではどうやってビューに値を渡すのかは以下のコントローラ作成で説明します。
次にコントローラを作成します。
fuel/app/classes/controller にhello.php というファイルを作ります。
中身は以下の通りです。
1 2 3 4 5 6 7 8 9 10 |
<?php class Controller_Hello extends Controller { public function action_index() { $data['title'] = 'hello world'; return View::forge('hello', $data); } } |
action_index でビューを生成して return で返しています。
View::forge(‘ビューファイル名’,’ビューに渡すデータ’); がビューを生成する関数です。
第1引数は生成するファイル名を指定した文字列を渡します
第2引数はビューで使用する変数を渡します。
変数の渡し方ですが、$data[‘title’] = ‘hello world’ というように用意した連想配列を渡します。
もちろん変数名は自由ですが、添字はビューファイルと関連付けて下さい。
この場合は、ビューで $title の中身を表示したいので、添字を title にします。
ビューファイルで使用する変数を、きちんと渡してあげないとエラーになるので注意して下さい。
作業が終われば、http://localhost/fuelphp/hello にアクセスでHelloWorldが表示されるはずです。
これが基本的なページの作り方ですが、本格的なサイトを作るためにはまだまだ足りません。
次回はTemplateコントローラを使ったページの作り方を説明します。
では、おやすみなさい。
規約その4 ビュー編
0
おはようございます。ゆうきんのはずです。
前回はモデルの説明を行ったので、今回はビューの規約をまとめます。
ビューだけは、コントローラとモデルの規約と大きく違います。
といっても少ないですが。
ビューの規約
- fuel/app/views に配置
- コントローラの中でView::forge()メソッドを使って生成し、返す
終わりです。
サンプル。
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>サンプル</title> </head> <body> <p>いあっ!いあっ!くとぅるふ!ふたぐん!</p> </body> </html> |
はい普通のHTMLと何も変わりません。
これだけ書くと何が何だかわからないと思うので次回から、実際にページを作りながら説明したいと思います。
では、おやすみなさい。
規約その3 モデル編
0
おはようございます。ゆうきんだと思います。
前回はコントローラの説明を行ったので、今回はモデルの規約をまとめます。
と、言ってもほぼコントローラと同じです。
モデルも、コントローラと同様でPHPで記述し、クラスを作成します。
モデルの規約
- fuel/app/classes/model に配置
- クラス名の先頭には必ず Model_ を付ける
- クラス名(Model_の後)の頭文字は大文字で他は全て小文字
- ファイル名とクラス名は同じにしなければならない
- クラス名中の _ はフォルダを表すので注意
- Modelクラスを継承する
これだけです。
例によってサンプルを。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php /** * サンプルクラス */ class Model_Sample extends Model { /** * サンプルメソッド */ public static function getData($number) { // データベースにアクセスしたりしてデータを返す $data = getNanchara($number); return $data; } } |
クラス作って、すメソッドを作って、データベースなんかにアクセスして、データ取得して、値を返す。
というのがモデルでやることです。
コントローラからどうやって呼び出すかとかはまた今度。
では、おやすみなさい。
規約その2 コントローラ編
0
おはようございます。ゆうきんです。
前回MVCパターンの説明?が終わったので、ようやく規約の説明に移ります。
今回はコントローラの規約をまとめます。
ちなみに、コントローラはPHPで記述し、クラスを作成します。
なお、サイトにアクセスするためのURLは、コントローラのフォルダ構成とメソッド名から決められます。
http://ドメイン/インストールフォルダ名/コントローラ名/メソッド名/パラメータ という具合です。
私の環境だと http://localhost/fuelphp/sample/index という感じになります。
コントローラの規約
- fuel/app/classes/controller にファイルを作成
- クラス名の先頭には必ず Controller_ を付ける
- クラス名(Controller_の後)の頭文字は大文字で他は全て小文字
- ファイル名とクラス名は同じにしなければならない(ファイル名がsample.php だった場合、クラス名はController_Sample となる)
- クラス名中の _ (アンダーバー) はフォルダを表すので注意(Controller_Top_Loginだとclasses/controller/top/login.php ということになる)
- Controllerクラスを継承する
- コントローラ/メソッド[/パラメータ1[パラメータ2[/…]]]でアクセス出来る(これがサイトのURLとなる)
- ブラウザ側から実行されメソッドは action_ を付ける
- コントローラ内でechoを使い出力するのはFuelPHPの規約から外れる(デバッグでは使用OK)
コントローラからの返り値について
- 文字列にキャストできるものしか返してはいけない(Responseオブジェクトで、Viewオブジェクト、文字列 など)
コントローラの特殊なメソッド
- action_index() URLでメソッド名が省略された場合に実行される
- before() アクションメソッドの実行前に自動実行される
- after() アクションメソッドの実行後に自動実行される
- roter() 内部ルーティングを上書き。アクションインデックスが受け取るはずだった引数を受け取り、実行する関数を切り替えることが出来る
Restコントローラ
- 規約にしたがって値を受けおり、サポートしているフォーマットを返す
- Controller_Restクラスを継承する
- 実行されるメソッドにはHTTPメソッドの接頭辞を付ける
- URLのメソッド名に出力フォーマット名の拡張子を付ける
- サポートフォーマット xml, json, jsonp, csv, php(eval()可能なコード), serialized
主にこんなところです。多いなぁと思うかも知れませんが、そんなことないです。
他のフレームワークに比べたら大分少ないですし、融通が聞きます。
ピンと来ない方のために簡単なサンプルソースを載せておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php /** * サンプルクラス * クラス名はController_ + 頭文字大文字 * Controller クラスを継承している */ class Controller_Sample extends Controller { /** * beforeメソッド */ public function before() { // アクションメソッドの実行前に自動実行 } /** * アクションインデックスメソッド */ public function action_index() { // URLのメソッド名を省略した時に実行される // URLは ドメイン/sample/index or ドメイン/sample になる } /** * 自作アクションメソッド */ public function action_top() { // URLは ドメイン/sample/top になる } /** * afterメソッド */ public function after() { // アクションメソッドの実行後に自動実行 } } |
こんな感じです。今回は規約だけを伝えるために、極限まで削りました。
実際のサイトを考慮した書き方はまた今度書きます。
コントラーラにはTemplateコントローラとHybridコントローラというものがあるんですが、またの機会に書きます。
では、おやすみなさい。
規約その1 MVCパターン?編
0前 なし
おはようございます。
休日はいつまでも寝ているが、なかなか寝付けないゆうきんです。
ちなみにこれが初投稿です。
これから、少しずつFuelPHPのことについて書いていきたいと思います。
よろしくお願いします。
今回はFuelPHPで特に気を付けなければならない規約をまとめたいと思います。
FuelPHPは、インストールして出来たフォルダに、対応するファイルを配置していくだけでWebサイトが作れるフレームワークです。
主に3種類のファイルを配置していくことになります。
3種類のファイルは「コントローラ」「モデル」「ビュー」で、それぞれに規約が存在します。
規約を書く前に「コントローラ」「モデル」「ビュー」の説明をしたいと思います。
知っている人は読み飛ばして下さい。
コントローラとは?
文字通りアプリケーション全体を制御するものです。
基本的にコントローラからモデルとビューを呼び出し、
ビューとモデルのデータ受け渡しも行います。
モデルとは?
モデルはデータの管理を担当します。
データベースの操作のみならず、ファイル操作、メールの送信なども役割となります。
ビューとは?
表示を担当します。えぇそれだけです。
これを合わせてMVCパターンと呼びます。FuelPHPのみならずいろいろなもので使います。
さて、説明が終わった所で、規約のまとめを書きたいと思いますが、長くなるので次に書きます。
FuelPHP全体の規約
- ファイル名、フォルダ名は全て小文字
- ファイルは全てPHP形式
- PHPのコードしか含まないファイルは、終了タグ( ?> )を書かない
- ファイル名とクラス名は同じにしなければならない
この3つは前提になるので、よく覚えておいて下さい。
次からは「コントローラ」「モデル」「ビュー」それぞれの規約をまとめます。
では、おやすみなさい。