FuelPHP
チュートリアル 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つは前提になるので、よく覚えておいて下さい。
次からは「コントローラ」「モデル」「ビュー」それぞれの規約をまとめます。
では、おやすみなさい。
Smartyを使う
0FuelPHPにテンプレートエンジンであるSmartyを足してみる。
ViewファイルをSmartyで書くと楽になるよ!っていうことです。
そもそもSmartyって何?っていうのはWikipedia参照でお願いします。
FuelPHPにSmartyをいれる
インストール手順。
1. Smartyをここからダウンロード。
2. ダウンロードしたものは圧縮されてると思うので展開する。
3. FuelPHPの「app/vendor」フォルダに、展開したSmartyフォルダを突っ込む。
4. FuelPHPの「app/config/config.php」を編集。paserというものを追記する。
1 2 3 4 5 |
'always_load' => array( 'packages' => array( 'parser', //追加 ), ) |
これでSmartyが使用可能になります。
早速Smartyを使ってみる
Smarty自体の使い方や構文はまた別の機会で。
ここではFuelPHPでのSmartyの使い方をかきます。
今までのViewファイル「sample.php」が
Smartyにすると「sample.smarty」になります。
このファイルをControllerから呼び出すには
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$data = array( 'title' => 'SampleTitle', 'test_user' => 'takahashi', ); //今までの呼び出し方 $view1 = View::forge('welcome/index',$data); //smartyファイルの呼び出し方 $view2 = View_Smarty::forge('welcome/index', $data) //拡張子指定のこんな呼び方もあります $view3 = View::forge('welcome/index.smarty',$data); |
このようにします。(下2種類が使えます)
肝心のindex.smartyの中身は
1 2 3 4 5 6 7 8 9 10 |
<html> <head> <title>{$title}</title> </head> <body> ようこそ!{$test_user}さん。 </body> </html> |
こんな感じです。
FuelPHPの初期設定 (CentOS)
0FuelPHPの初期設定メモ。
パスが微妙にUbuntuっぽくないのは、それは私がCentOS使ってたせいです。ごめんなさい。
大体同じなので気にせず。
では行きます。
1. Apache PHP MySQL oil をインストールする
はい、それぞれインストールしてください。
oilはここでインストール手順を見ましょう。
2. oil create する前に・・・
php.iniを編集
1 2 |
[Date] ;date.timezone = |
を
1 2 |
[Date] date.timezone = ‘Asia/Tokyo' |
とします。
環境によっては、最初からなっていてすんなりoil create が通るかもしれませんね。
3. oil create ・・・
適当なフォルダに「oil create ・・・」を実行してFuelPHPをインストールします。
今回は,/home/test_user/sample という具合に作るとします。(test_userは今回使用するユーザーアカウントです)
1 2 |
$cd /home/test_user $sudo oil create sample |
これで完了。
次に、作成したsample配下のpublicのシンボリックリンクをApacheの公開ディレクトリに貼っ付けてあげます。
1 |
$sudo ln -s /home/test_user/sample/public /var/www/html/fuel |
そして忘れちゃならんのが、Apacheがリンク先にアクセスできるようにパーミッションの変更をしなければならないです。
oilコマンドにて作成したFuelPHPディレクトリの「sample」は、oilコマンドが自動的に適切なパーミッションにしてくれるのでそのまま。
この時変更するディレクトリはユーザーのホームディレクトリ。
1 |
$sudo chmod 705 /home/test_user |
これでAHー64 Apacheが燃料タンクFuelPHPの公開フォルダ(public)を攻撃見つけることが可能となります。
Apacheが起動している場合、この時点で外部公開されています。
4. config.php
sample/fuel/app/config/config.php を編集しまっしょい。必要最低限+アルファで。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php ini_set('default_charset', 'UTF-8'); return array( 'index_file' => false, 'language' => 'ja', // Default language 'language_fallback' => 'en', 'locale' => 'ja_JP', 'default_timezone' => 'Asia/Tokyo', 'log_threshold' => Fuel::L_ALL, 'log_path' => APPPATH.'logs/', 'log_date_format' => 'Y-m-d H:i:s', ); |
2行目は文字コード設定。
大事なのはtimezoneの設定。あぁ怖い怖い。
下の方のlogはFuelPHPが出力してくれるログの設定です。
log_thresholdでALLとか指定すると、エラーや警告含め全部ログ出してくれます。
超最低限設定は以下
1 2 |
<?php return array('default_timezone' => 'Asia/Tokyo'); |
やっぱりタイムゾーンだけは設定しないとエラーになる。(私の環境だけ?)
あぁ怖い怖い。
5. 試しにアクセス
ここまできたらブラウザからアクセスしてみましょう。
Welcomeページが表示されるはずです。
表示されなかった場合は、あなたの設定が間違っているか、私の説明が適当だっていうことです。
インストール
0最近人気という噂のPHPフレームワーク、FuelPHPを使ってみます。
日本語のドキュメントはこちらで閲覧できます。gitでざっくり落とすならこちら。
インストールは、自動または手動を選択できますが、ここでは自動インストールを行います。
まず最初にFuelPHPの様々な自動生成機能を提供してくれるoilコマンドをインストールします。
1 |
$ curl get.fuelphp.com/oil | sh |
oilコマンドをインストールしたら、HTMLのドキュメントルートに移動し、oilコマンドでプロジェクトリソースを生成します。
1 2 3 4 5 6 |
#ubuntuの場合のデフォルト $ cd /var/www #mysightディレクトリに置くことにします $ mkdir mysight #mysightディレクトリにリソースをインストールします $ oil create mysight |
これでインストールは完了です。
ブラウザでmysight/publicを開くとウェルカムページが表示されます。
mysight下のfuelphpをEclipse PDTにプロジェクトとして取り込めば開発を始めることができます。
2013年1月8日現在、FuelPHPのEclipseプラグインはまだ無いようです。
FuelPHPを使ってみた過程を書いていきます。
連載にあたっては、達人出版会の「はじめてのフレームワークとしてのFuelPHP」を参考にしました。