2013年8月19日月曜日

FuelPHPを仕事で使うときに知っておくべき4つのこと

こちらでもあるとおり、先月から新しい職場で働いてます。
で弊社は自分が来たことをきっかけにFuelPHPを使っています。
元々弊社はPHPならSymphonyと言うフレームワークを使ってました。
Symphonyを使ってるなら海の向こうで流行っているlaravelも考えたのですがFuelPHPを使うことにしました。
と言うことでお仕事でFuelPHPを使っているので気付いたことをまとめておきたいと思います。
個々での情報はあるのですが纏めてあるものはまだまだ少ないですしね。
またプライベートでアプリを作った時のまとめはこちら。
今からFuelPHPを触ってみたい方は下記のリンクを見るのをおすすめします。

今からFuelPHPを使う人が知るべき5つのこと+1


//2014/05/08に別記事書いたのでこちらも参考にどうぞ。

FuelPHPでセキュアな設定をする



実際に仕事でFuelPHPを使っていると「後々のことを考えるとここはキッチリしたい」って場面が沢山あると思います。
そういうところを疎かにすると負の遺産になります。
もちろん、FuelPHPはそんな時の答えをちゃんと用意してくれています。

1 環境設定による設定値の切り替え

お仕事で開発するとなると
  • テスト環境
  • 開発環境
  • ステージング環境
  • 本番環境
が用意されてますよね?
(実際はテスト環境すら無いことあるけどね...)
では実際にこれらの環境に合わせてDBであったり、特定の環境変数を切り替えたい場面は多々あります。
これらの設定をFuelPHPは分けることが出来ます。

公式ドキュメント(環境)

こちらの引用ですが
環境の設定は、サーバ変数 FUEL_ENV をセットするか、 手動で fuel/app/bootstrap.php 内の設定を変更することで設定します。 
で切り替えることができます。
つまり、Apacheのサーバ変数を設定しておけば、テスト環境で本番DBを更新するなどの問題を防ぐ事ができます。
bootstrap.phpを編集する場合は以下のとおりに

/**
 * Your environment.  Can be set to any of the following:
 *
 * Fuel::DEVELOPMENT
 * Fuel::TEST
 * Fuel::STAGING
 * Fuel::PRODUCTION
 */
Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT);


DEVELOPMENTの部分を変えることで切り替わります。
読み込み先の対象ファイルは

app/config/[環境別ディレクトリ]/

となります。
また環境変数が本番環境のPRODUCTIONの時とそれ以外ではerror時(例外をcatchしてない時など)の表示が違います。
具体的にはDEVELOPMENT等では該当の箇所のソースが表示されます。
PRODUCTIONにしておけばエラーページを表示してくれます。
ですがFuelPHPのデフォルトではエラー表示はONになっています。

public/index.php

の先頭にある

error_reporting(-1);
ini_set('display_errors', 1);

を下記の通りに変更します。

error_reporting(0);
ini_set('display_errors', 0);

これで本番環境時にはPHPのエラーが表示されることはありません。
また1.6以上であればエラーが発生した場合はデフォルトで

fuel/app/logs/

にエラーが出力されます。
これは日別にログがローテートされてます。
ですのでこちらを監視することで色んな問題を解決することが出来ます。

またセキュリティのことに関しては下記のリンク先が素晴らしいです。
こちらを是非とも一読ください。

FuelPHP でのセキュリティ対策(3) - A Day in Serenity @ kenjis


2 複数DBへの接続

一つの環境で複数のDBに接続することは多々あります。
こちらの方法ですがまず

fuel/app/config/development(各自の環境変数に合わせてください)/db.php

に下記の通りhogeのグループを追加します。
※例はPostgreSQLにつなぐ場合です

return array(
    'active' => 'default',
    'default' => array(
        'identifier' => '"',
        'connection' => array(
            'dsn' => 'pgsql:host=localhost;dbname=default_db',
            'username' => 'default_user',
            'password' => 'default_password',
            'encoding' => 'utf8',
        ),
    ),
    'hoge' => array(
        'identifier' => '"',
        'connection' => array(
            'dsn' => 'pgsql:host=192.168.1.1;dbname=hogehoge',
            'username' => 'hoge',
            'password' => 'm9(^w^)',
            'encoding' => 'utf8',
        ),
    ),
);

これでdefault以外のhogeの接続情報が入りました。
あとは実際に呼び出す際に

//default
DB::query('SELECT * FROM test')->execute();
//hoge
DB::query('SELECT * FROM test')->execute('hoge');

となります。
指定しない場合はdefaultが呼ばれますが当然defaultを呼ぶことも出来ます。
ですので

DB::query('SELECT * FROM test')->execute($db_name);

として呼び出し先を動的に変えることも出来ます。

3 オリジナルのconfファイルの作成と読み込み

公式ドキュメント(configクラス)

またこちらのリンク先が丁寧に解説してあります。

FuelPHPでオリジナルconfigファイルの作成

こちらを設定することで
Config::get('hoge')
と取ってくることが出来ます。
私はalways_loadを設定して常に呼び出せるようにしています。


4 メタプログラミング

PHPでもメタプログラミングは出来ます。
特にFuelPHPではオートローダー機能の恩恵でよりシンプルに行えます。
※FuelPHPのクラスの自動読み込みについてはこちらを参考にどうぞ

例えばPHPは

//三項演算子(hogeの時にmodel_hogeを代入し、それ以外はmodel_fuga)
$class_name = ($model_name == 'hoge') ? 'model_hoge' : 'model_fuga';
//インスタンス化
$model = new $class_name();
$result = $model->method();
//静的呼び出し
$result = $class_name::method();

と出来ます。
例ではクラス名が$model_nameの中身に合わせて'model_hoge'と'model_fuga'で切り替わります。
この場合、呼び出しのクラスが読み込まれている必要があるため

require_once 'hoge.php';
require_once 'fuga.php';

と両方のファイルを読み込むコードが必要になります。
(または色んなクラスが書かれた巨大なファイルを作る必要があります。)
ですがFuelPHPはクラスの読み込み時に命名規則に合わせて動的にクラスファイルを読み込みます。
つまりrequire_once地獄や巨大なファイルと戦う必要がありません。
ですのでコードを足す度に上記のようにrequire_onceを書く必要がありません。
DBの値からクラスを動的に呼び出す場合などは新たにクラスファイルを作成するだけです。
このようにPHPの可変関数は非常にシンプルで強力です。
さらに__callなどのマジックメソッドを使えば多くの事が出来ます。
ただし、メタプログラミングはやり過ぎると作成者以外が分かりにくくなるのでケース・バイ・ケースです。


以上の4つ、いかがでしょうか。
さらにセキュリティ、バリデーションなどFuelPHPは充実しています。
「こんなことしたいな...」と思った際は一度FuelPHPのドキュメント等を見てみると大抵あります。
また機会を見つけてFuelPHPの情報をまとめていきたいと思います。