FuelPHP入門

高速で軽量なフレームワークFuelPHPを使う
FuelPHPは、PHP 5.3以上を対象に開発された高速で軽量なフレームワークです。既存のPHPフレームワークの長所を継承しつつ、規約より設定を重視して設計されていますので、複雑な設定ファイルに悩まされることはありません。そのため、フレームワークのルールに縛られて開発作業が制限されるということがあまりなく、高度なWebアプリケーションの開発に向いていると期待されています。
- 名称: FuelPHP
- URL: http://fuelphp.com/
- インストール方法: curl get.fuelphp.com/oil | sh
インストール
Linux/Mac OSXの場合
FuelPHPのインストールは次のようにコマンドラインより行います。
コンソール
# curl get.fuelphp.com/oil ¦ sh |
Windowsの場合
FuelPHP本家サイトのDownloadリンクより最新版(fuelphp-1.7.1.zip)をダウンロードしてアーカイブを解凍します。解凍後のfuelphp-1.7.1のディレクトリ一式をfuelphp-1.7.1/publicがドキュメントルートになるようにWebサーバに配置します。
FuelPHPの基本的な使い方
FuelPHPは、既存のPHPフレームワークの長所を数多く採用したPHP5.3以上を対象にしたフレームワークです。2011年に最初のバージョンが公開され、PHPフレームワークの中では比較的新しい部類に入ります。フレームワークの構成はMVCモデルを採用し、他のフレームワークに比べて規約が少ないため、非常に使いやすいです。FuelPHPの特徴をまとめると次のようになります。
- 設定ファイルでの細かな指定がなく、ディレクトリとクラス名で役割を指定
- 必要なクラスを自動で呼び出すオートローダーが実装されており、require文/include文が不要
- Controllerからロジックを分離するViewModelの仕組みがあり、ソースコードの肥大化を防止
- 上記のとおりシンプルな構成のため、動作が高速
非常にわかりやすいフレームワークで細かな設定ファイルがない反面、MVCの役割を担うクラスには命名規則があり、命名規則は必ず守る必要があります。
また、MVCモデルを採用したフレームワークでは、Model/Viewに対する複雑な処理をControllerやModelのソースコードに記述してしまうことがあります。そのような場合、1ファイルごとのソースコードが大きくなりすぎて、システムの品質が落ちてしまったり、メンテナンスに手間がかかってしまうことがあります。
FuelPHPでは、ViewModelというViewやModelに対する処理をControllerから分離する仕組みがあります。そのため、Controllerはリクエストの処理やバリデーションに専念することができ、本来の役目以外の処理をソースコードに記述せずに済みます。まとめると図96-1のようになります。

図96-1 FuelPHPの構成
FuelPHPを使ったシステム開発では、MVCモデルの概念に沿った開発が可能となり、出来上がったシステムの品質の面でも優れたものとなります。図96-2aと2bの2つのサンプルを作成しながらFuelPHPの基本的な使い方について説明します。
http://localhost/sample/index
作成するサンプル: データの一覧表示
http://localhost/sample/form
作成するサンプル: データの登録とバリデーション
送信先:http://localhost/sample/save
プロジェクトを生成する
FuelPHPでは、開発するアプリケーションをプロジェクトという単位で扱います。プロジェクトのひな型を生成する手順は、OSによって異なります。
Linux/Mac OSXの場合
次のコマンドでプロジェクトを生成できます。
# oil create [プロジェクト名]
Windowsの場合
Windowsの場合は、コマンドでのプロジェクト生成がサポートされていませんので、インストールの際にダウンロードしたアーカイブをコピーしてプロジェクトのひな型とします。
プロジェクト配下のディレクトリ構成は、図96-3のようになっており、APPPATHにクラスを作成してアプリケーションを開発します。

プロジェクトのディレクトリ
Controller
Controllerは、APPPATH/classes/cntrollerに配置します。クラスを作成する際の命名規則はリスト96-1のとおりです.
class Controller_ディレクトリ名_ディレクトリ名_クラス名 extends Controller
リスト96-1 Controllerクラス作成の命名規則
必ずControllerクラスを継承し、APPPATH/classes/cntrolerからクラスファイルまでのディレクトリを1文字目を大文字にして「_」でつないで最後にクラス名を1文字目を大文字にして命名します。APPPATH/classes/cntroler直下にクラスを配置する場合は、ディレクトリ名はつけずにそのままクラス名で構いません。
URLからコントローラを呼び出す際には、/ディレクトリ名/クラス名/メソッド名/パラメータ となり、その関係は図96-4のとおりです。

図96-4 URLとクラスの関係
ディレクトリ名、クラス名、メソッド名までつなげて、パラメータがある場合はパラメータも記載します。パラメータはそのままメソッドの引数となります。メソッド名がindexの場合は、メソッド名を省略することもできます。サンプルの例であれば、入力画面を表示するURLはhttp://localhost/sample/formとなります。
リスト96-2は作成するサンプルのデータベース内のusersテーブルの一覧を表示/フォームによる登録を行うコントローラのコードです。
クラス定義を行った後、index(一覧)、form(入力)、save(保存)の各メソッドを定義します(1)。
一覧を表示するaction_indexメソッドでは、O/RマッパーのModel_Userクラスのfind_allメソッドで、全レコードを取得し、Viewに渡します(2)。Viewは、Viewクラスのforgeメソッドに、テンプレートとなるファイルと表示する変数を渡します。変数は配列の形式で渡します。
PHP
// 1クラス定義
class Controller_Sample extends Controller{
// 2一覧を表示するindexメソッドを定義
public function action_index(){
$data = array();
$data['rows'] = Model_User::find_all(); // userテーブル内の全レコードをビューに渡す
return View::forge('sample/list', $data); // テンプレートと変数を渡してViewを生成
}
// 3入力画面を表示
public function action_form(){
return View::forge('sample/form'); // テンプレートを指定
}
// 4Formで送信されたデータを保存
public function action_save(){
// 5バリデーション定義
$validation = Validation::forge();
$validation->add('name', 'お名前')->add_rule('required'); // 名前の入力を必須に
$validation->add('email', 'email')->add_rule('required'); // メールの入力を必須に
$validation->add('age', 'Number')
->add_rule('required')
->add_rule('valid_string', array('numeric')); // 年齢の入力は必須かつ数値
if (Input::post()) {
// 6バリデーションOK時の処理
if ($validation->run()) {
$form = array();
$form['name'] = Input::post('name'); // パラメータを取得テーブル
$form['email'] = Input::post('email'); // テーブルのカラムと値がセットになるように
// 7O/Rマッパー
$user = Model_User::forge();
$user->set($form); // カラムに値をセット
$user->save(); // 保存
// 8sample/indexを実行し、画面に表示
echo Request::forge("sample/index")->execute();
exit;
}else{
// 9エラーがあるときは入力画面に戻す
$view = View::forge('sample/form');
$view->set('errors', $validation->error());
}
}
return $view;
}
}
リスト96-2 APPPATH/classes/controller/sample.php
入力画面(図96-5)を表示するaction_formメソッドは、とくに渡すデータはないのでテンプレートのみでViewを生成します。

図96-5 生成した入力画面
入力された値を保存するaction_saveメソッド(4)では、まず入力画面のバリデーションを行います(5)。バリデーションを定義するValidationクラスのインスタンスを生成し、addメソッドでformの項目を指定、add_ruleメソッドでバリデーションを行う際の条件を指定します。バリデーションの条件が複数存在する場合は、add_ruleメソッドで続けて指定します。
バリデーションはrun()メソッドで実行でき、通過したかどうかはtrue/falseで得られます(6)。通過した場合は、O/Rマッパーのインスタンスを生成し、formから受け取った値を保存します(7)。その後、sample/indexのアクションを実行し、一覧画面を表示します(8)。バリデーションを通過しない場合は、戻すビューを指定して、バリデーションのエラーメッセージを渡します(9)。
FuelPHPの特徴として、クラスを初期化する際にはforgeメソッドが利用されることが多いです。
リスト96-3は既定で呼び出されるアクションとメソッドを定義する例です。APPPATH/classes/cntroler/route.phpに記述します。
return array(
'_root_' => 'sample/index',
);
FuelPHPで画面を表示する/DBを利用する
FuelPHPが提供する「HTMLを生成するのに便利なメソッド」や「DBの利用時にSQLを記述せずにCRUD操作が行えるクラス」について解説する。書籍転載の6本目(書籍内の番号は「97」)。
FuelPHPでは、HTMLを生成するのに便利なメソッドが数多く用意されています。DBの利用時にも、SQLを記述せずにCRUD (Create Retrieve Update Delete) 操作を行うことのできるクラス/メソッドが用意されています。
- 名称: FuelPHP
- URL: http://fuelphp.com/
- インストール方法: curl get.fuelphp.com/oil | sh
View
ViewはAPPPATH/viewsに配置します。
Controllerのメソッドから呼ばれる名前にします。プログラムではないので、クラス名やメソッドは不要です。基本的にControllerから受け取った引数をHTML内に表示するだけで、プログラム的な処理は行いません。View内では、特定のHTML要素を表示する補助的なクラスを利用することができます。
リスト97-1は、“sample/form”の名前で呼ばれるViewのテンプレートです。
// 1バリデーションでエラーになった場合のメッセージを表示
<?php if (isset($errors)): ?>
<ul>
<?php foreach ($errors as $error): ?>
<li><?php echo $error ?></li>
<?php endforeach ?>
</ul>
<?php endif ?>
// 2フォーム定義
<?php echo Form::open("sample/save") ?> // 送信先
お名前:<?php echo Form::input('name', Input::post('name')) ?><br /> // 各項目の入力欄
mail:<?php echo Form::input('email', Input::post('email'), array('required' => 'required')) ?><br /> // HTML5のエラーチップを出す場合
年齢:<?php echo Form::input('age', Input::post('age')) ?><br />
<?php echo Form::submit('submit_btn', '送信') ?> // 送信ボタン
<?php echo Form::close() ?>
リスト97-1 APPPATH/views/sample/form.php
バリデーションでエラーとなった場合のエラーメッセージを表示します(1)。変数$errors内に複数のセットで渡されますので、$errorsが存在する場合にforeachで回して1つひとつ表示します。
フォームの定義は、Formクラスで行います(2)。openメソッドでフォームの送信先、inputメソッドで入力欄、submitメソッドで送信ボタンを生成します。
inputメソッドの第3引数には、HTML5のフォーム機能を利用する属性を指定できます。requiredを指定すると、フォーム送信時に空欄だとエラーチップを表示します(図97-1)。HTML5の機能を標準で使えるメソッドがあることは、FuelPHPの特徴の1つです。

図97-1 生成した入力画面でのエラーチップ表示
Model
ModelはAPPPATH/classes/modelに配置します。Modelは、オブジェクトとデータベースの情報を対応させるO/RマッピングクラスのModel_Crudクラスを継承します。Model_Crudクラスは、その名前のとおり、レコードの作成(create)、更新(update)、削除(delete)を行います。このクラスを継承するため、それらのメソッドはModelのソースコードに記述しません。記述するのは、テーブルの名前とプライマリキーのみです。
リスト97-2は、usersテーブル(リスト97-3)に対するModelです。ソースコードに記述するのはusersテーブルのテーブル名、プライマリキーのみです。
class Model_User extends \Model_Crud {
//テーブル名とプライマリキーを指定
protected static $_table_name = 'users';
protected static $_primary_key = 'id';
}
リスト97-2 ModelはAPPPATH/classes/model/user.php
SQL
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
`email` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
)
リスト97-3 usersテーブルの定義
ViewModel
ViewModelはAPPPATH/classes/viewに配置し、Controllerに書くべきではない表示の補助的な処理を行います。ControllerとViewと違って、利用する必要がない場合は、利用しなくてよいクラスです。
リスト97-4~97-6は、usersテーブルからidが1のものを取得するViewModelの例です。ViewModelクラスを継承してクラス定義を行います(1)。クラス名とディレクトリ/ファイル名の関係は「/」を「_」に置き換える命名規則です。
PHP
// 1クラス定義
class View_Sample_Member extends ViewModel{
// 2Viewに渡すメソッド
public function view(){
$this->user = Model_User::find_by_pk(1); // idが1のレコードを取得して変数に格納
}
}
リスト97-4 APPPATH/classes/view/sample/member.php
HTML+PHP
<body>
// 3ViewModelから渡された変数にアクセス
<?php echo $user->name; ?>
</body>
リスト97-5 APPPATH/views/sample/member.php
PHP
public function action_member(){
// 4ViewModelを取得
$viewmodel = ViewModel::forge('sample/member');
return Response::forge($viewmodel);
}
リスト97-6 APPATH/classes/controller/sample.php
Viewに変数を渡す処理は、viewメソッドをオーバーライドして記述します(2)。Viewでは、ViewModelから渡された変数に「$this」を外してアクセスできます(3)。Controllerでは、ModelViewを取得してResponseクラスに渡します(4)。
参考2ー1: FuelPHP フレームワークをインストール
参考2ー2: FuelPHP フレームワーク超入門
参考3: FuelPHP【チュートリアル】– コントローラーのテストの方法 —
参考4: FuelPHP – Model_Crudの作り方と使い方
FuelPHP の Rest コントローラの使い方とデフォルトフォーマットの変更の仕方
バリデーションの表示言語を日本語に設定する
CSRF対策
例外を自分で設定する
modules以下のclassesのパスについて
異なるフォームの値が同じかどうかのバリデーションを掛けたい時
カスタム(独自)バリデーションの作成
パッケージを読み込みたいとき
コンフィグを読み込みたいとき
など