icon 2011/11/22 FuelPHP の概要
PHPフレームワーク FuelPHP が話題になったのでインストールしてみた。

詳しい記事は、PHP フレームワークの「FuelPHP」がスゴすぎる を参照に。

- ORM、マイグレート対応しており、MongoDB、Redis も使えるとの事
- 基本的にスタティックにコーディングするので(インスタンスを経由ラッパーしていると思う)ので書くコードが少なそう
- Unitテスト(PHPUnit、Jenkins)対応
- autoload 対応でライブラリ、ヘルパーの自動ロードができる
- Scaffolding 対応(oilコマンド)
- 多数のViewテンプレート対応

会社では独自フレームワークを使って、更にDBと連動してアプリ作成自動化を進めてますが、一人よがりなんですよね。
比較してみて良さげだったら切り替えようかと・・・


PHP フレームワークとして評価が高い「Codeigniter」の対抗として注目されているみたいです。

oil のインストール


RoR みたいにプロジェクトを作成するのに oil コマンドが必要なのでインストール

$ curl get.fuelphp.com/oil | sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 244 100 244 0 0 705 0 --:--:-- --:--:-- --:--:-- 1410
password:


パスワードを聞かれるのは、/usr/bin にコマンドをいれるかららしい。

プロジェクト作成


$ cd Sites/
$ oil create blog

Cloning into ./FuelTest...
remote: Counting objects: 14115, done.
remote: Compressing objects: 100% (4842/4842), done.
remote: Total 14115 (delta 9635), reused 13321 (delta 9041)
Receiving objects: 100% (14115/14115), 2.06 MiB | 666 KiB/s, done.
Resolving deltas: 100% (9635/9635), done.
Submodule 'docs' (git://github.com/fuel/docs.git) registered for path 'docs'
...
Made writable: /Users/yoo/Sites/FuelTest/fuel/app/cache
Made writable: /Users/yoo/Sites/FuelTest/fuel/app/logs
Made writable: /Users/yoo/Sites/FuelTest/fuel/app/tmp
Made writable: /Users/yoo/Sites/FuelTest/fuel/app/config



パーミッションを手動で変えたい場合は、

php oil refine install
Made writable: /Users/yoo/Sites/FuelTest/fuel/app/cache
Made writable: /Users/yoo/Sites/FuelTest/fuel/app/logs
Made writable: /Users/yoo/Sites/FuelTest/fuel/app/tmp
Made writable: /Users/yoo/Sites/FuelTest/fuel/app/config



public を Web ルートに


デフォルトだと、Webルートがプロジェクトディレクトリになってしまうので public を Webルートに設定する必要がある。
Appache の設定で、public をWebルートにするか、.htaccess で public/ へ rewirte 設定してやる。
Options -MultiViews

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule (.*) public/$1 [L]
</IfModule>

ファイル構成


.git
.gitmodules
README.md
docs/
oil
.gitignore
CHANGELOG.md
TESTING.md
fuel/
public/


デフォルトだと、Git 管理される。
public/ fuel/ ディレクトリだけの構成
oil は拡張子こそないがPHPファイル(PHPコマンドで使うのかな?)

fuel/


app/
core/
packages/


RoR のような構成とはちょっと違うが、名前から大体想像がつくと思います。

fuel/app/


bootstrap.php
classes/
config/
lang/
logs/
migrations/
modules/
tasks/
tmp/
views/


こう見ると、たくさんの機能がサポートされてる臭いがします。
config/ では、アプリの一般設定やDB設定ファイルがあり、開発/デプロイと分ける事が可能。
ローカライズ(デフォルト en)、XSS対応、cookie、モジュール管理、パスのルーティングなどなど多彩な設定が用意されています。

classes/ では

controller
model
view


といった、アプリ作成でお馴染みの顔ぶれが。
ただ、fuel/views というディレクトリもあるので使い分けは不明だが、テンプレート自体は app/views に HTML を記述するっぽい。
classes/view は、HTMLレンダリングする前にパラメータを変えたりヘルパー的な事を記述するような気がする。

public/


.htaccess
assets/
index.php


.htaccess でリライトして、index.php が最初に読み込まれます。
/**
 * Set error reporting and display errors settings.  You will want to change these when in production.
 */
error_reporting(-1);
ini_set('display_errors', 1);

/**
 * Website document root
 */
define('DOCROOT', __DIR__.DIRECTORY_SEPARATOR);

/**
 * Path to the application directory.
 */
define('APPPATH', realpath(__DIR__.'/../fuel/app/').DIRECTORY_SEPARATOR);

/**
 * Path to the default packages directory.
 */
define('PKGPATH', realpath(__DIR__.'/../fuel/packages/').DIRECTORY_SEPARATOR);

/**
 * The path to the framework core.
 */
define('COREPATH', realpath(__DIR__.'/../fuel/core/').DIRECTORY_SEPARATOR);

// Get the start time and memory for use later
defined('FUEL_START_TIME') or define('FUEL_START_TIME', microtime(true));
defined('FUEL_START_MEM') or define('FUEL_START_MEM', memory_get_usage());

// Boot the app
require APPPATH.'bootstrap.php';

// Generate the request, execute it and send the output.
try
{
	$response = Request::forge()->execute()->response();
}
catch (HttpNotFoundException $e)
{
	$route = array_key_exists('_404_', Router::$routes) ? Router::$routes['_404_']->translation : Config::get('routes._404_');
	if ($route)
	{
		$response = Request::forge($route)->execute()->response();
	}
	else
	{
		throw $e;
	}
}

// This will add the execution time and memory usage to the output.
// Comment this out if you don't use it.
$bm = Profiler::app_total();
$response->body(
	str_replace(
		array('{exec_time}', '{mem_usage}'),
		array(round($bm[0], 4), round($bm[1] / pow(1024, 2), 3)),
		$response->body()
	)
);

$response->send(true);

// Fire off the shutdown event
Event::shutdown();

DOCROOT : doc パス登録
APPPATH : fuel/app パス登録
PKGPATH : fuel/package パス登録
COREPATH : fuel/core パス登録
FUEL_START_TIME : fuelphp 開始時間登録
FUEL_START_MEM : fuelphp メモリ容量登録

bootstrap.php で app のメインファイルを起動し、autoloader.php でオートロード(必ず読み込むファイル)等を管理しています。
CodeIgniter だと手動で書かなければいかない点が、FuelPHP では自動ロード可能って事ですね。

最後に、config.php を読み込んでいます。

コントローラーとビューの作成


■ビューファイル
app/views/inquiry/index.php

普通にHTMLファイルを記述
レイアウトの分け方は現在不明

■コントローラーファイル
app/inquiry.php
class Controller_Inquiry extends Controller
{
	/**
	 * The basic welcome message
	 * 
	 * @access  public
	 * @return  Response
	 */
	public function action_index()
	{
		return Response::forge(View::forge('inquiry/index'));
	}

	/**
	 * show how to use them.
	 * 
	 * @access  public
	 * @return  Response
	 */
	public function action_send()
	{
	}

}
- クラス名は、Controller_コントローラ名(最初は大文字)
- デフォルトは Controller を継承
- ビューレンダリングは Response::forge() ,View::forge() を利用
- Fuel独自の関数 new static を実装しており、静的メソッドで書く事が可能

Response 、Viewで使える関数は、fuel/core/classes/response.php ,view.php を参照するとよいかと。
ちなみに Viewに関しては、forge(), render(), factory() といった数種類の方法がある。

ただアクション名とファイル名が一致したら、レンダリングの記述は省いて自動レンダリングしてくれる機能は欲しいところです

Codeigniter の対抗になるか?


Codeigniter vs FuelPHP でも比較検討の記事が掲載。

FuelPHP は機能は良いけど、新しい機能への弊害や利用者数の少なさが問題のようですね。

このサイトについて

HTML5 & CSS3化しつつあるので、現在IEには対応してません。
できれば、Google Chromeやら Apple SafariのWebKit系をお勧めします。

DBからプログラムまで一応全て自作なので、バグってたらすいません。
実験でFlash版(Flex版)を先に作りましたが、ちょっと停止してます。

プロフィール

新宿近辺でSE & プログラマーしてます。
Webアプリの開発・設計とか、最近はiPhoneとか奮闘してます。
デザインはさっぱりです。

音楽は、昔からCubase打ち込み人間で、そっちの方が経歴は長いですが、最近はやる暇がないです。。。

今は、Gon's Privates ってバンドのキーボードやってます。
単発的に、なんちゃってジャズ系のライブもやってます。

名古屋生まれなのでドラゴンズ好きです。

Info && SNS

Gmail

 yohei.yoshikawa@gmail.com

Twitter

 http://twitter.com/yoo_yoo_yoo

あんまつぶやきませんが、一応技術系メインで使ってます。情報交換はこちらへ

FaceBook

 http://www.facebook.com/#!/profile.php?id=1439130626

海外の知り合いがいないので閑散としてます。

mixi

 http://mixi.jp/show_profile.pl?id=230072

音楽仲間とかはこっちメインでやってます。興味があればこちらへ