FuelPHP の概要

2011/11/22

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


    RewriteEngine on
    RewriteRule (.*) public/$1 [L]

ファイル構成

.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 は機能は良いけど、新しい機能への弊害や利用者数の少なさが問題のようですね。