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の情報をまとめていきたいと思います。

2013年8月8日木曜日

今後の参加予定な勉強会の告知

もじゃ変さんがまとめてたので自分の主催の有無問わず参加予定の勉強会を告知。
ざっと予定を纏めたけど10月初めまで結構件数あって嫁ゲージやばい。
そのための牽制の意味が含まれてます


2013/8/27 第七回 岡山Python勉強会

http://atnd.org/events/42305

毎月定例のPython勉強会です。
今回は自分はSkypeで参加しようと思います。
すっごいゆるふわ系の勉強会なのでいろいろとチャレンジしていきたいですね。
あとPythonやるやるって言いながら全然書いてませんw


2013/8/31 TDD Boot Camp 岡山 2.0

http://tddbc.doorkeeper.jp/events/4941

テスト駆動開発のハンズオンですね。
実は自分はまだどの言語でどのように参加するか決めてないので保留中。
去年参加出来なかったので今年は是非とも参加したいですね。
ただ一部から懇親会のLTを強いられているけど色々と失うものが多そうです。


2013/09/14 岡山Git勉強会

http://local.aguuu.com/events/19879

今回はGitHubのハンズオンらしいです。
地味に最近は読書会やらハンズオンが多いですね。
これは「明確な技術的な収穫が欲しい」ってニーズがあるんだと思います。
あとやっぱ最初の取っ掛かりは一人では苦しいのでハンズオンは助けになります。
てなわけでGitHubをガンガン使ってるわけではないので行ってきます。




2013/09/16 JavaEE7 ハンズオン

http://local.aguuu.com/events/21329

ついに自分もJavaを触る日が来ましたw
Javaとかマジ全然出来ないんですがだからこそハンズオンに参加してきます。
つか参加者的に自分がいちばんJava力なんで予習必須ですね…


2013/10/05 第二回 中国地方DB勉強会

http://local.aguuu.com/events/21550

第一回を岡山でしたので今度は広島で開催します。
コンテンツがまだ決まってませんが会場等は決まってます。
OSC広島の前夜祭的に出来たらいいなぁと思ってたりします。


2013/10/06 OSC広島 2013

http://www.ospn.jp/osc2013-hiroshima/

前述のとおり、連日開催です。
今回はさくらインターネットさんが来るみたいで個人的にはOpenStackとそれが楽しみです。
もちろんJPUGも参加しますので皆さんよろしくお願いします。



さらにこれに9月のPython勉強会が定例で入ってきます。
個人的には不定期開催のたけともそんを9月の何処かでやりたいなぁと思ってたりもします。
しかしこんだけスケジュールが詰まってるとお財布に優しくありませんねw
でもこの他に面白いイベントがあれば是非とも教えて下さい。

それでは皆様と会場で会えることを楽しみにしてます。

第一回 中国地方DB勉強会を開いてきた

ついに中国地方でのDB勉強会を始めました。
JPUG主催ですがPostgreSQLのみならず広くDB関連をカバーしたいと思っています。
そんな意図もあって第一回は大垣さんと奥野さんに来て頂きました。

当日のTwitterまとめはこちら。

第一回 中国地方DB勉強会 まとめ #Chugokudb


またMLとしてGoogleグループを作成しました。
当日の資料や登壇の動画はこちらにありますのでご参考までに。
次回の情報や今後のフォローアップでも活用しますので是非ともご参加ください。

・Googleグループ
  https://groups.google.com/d/forum/dbstudychugoku

  dbstudychugoku@googlegroups.com

また講師のお二人が当日の資料をブログにアップして頂いております。
こちらも合わせて御覧ください。

大垣さん
第一回 中国地方DB勉強会の資料
http://blog.ohgaki.net/db

奥野さん
第一回中国地方DB勉強会で発表したスライドをアップロードしました。
http://nippondanji.blogspot.jp/2013/08/db.html


個人的には今回は主催者としては集大成だったなと言うくらいに色々とやりました。
それでもまだまだ周囲の方に助けて頂いてなんとか開催出来たと言うのが感想です。
今後も隔月程度で中国地方で開催していきますのでどうぞよろしくお願いします。

それと第二回は広島市で行います。
コンテンツについてはまだ未定ですが場所と日時は確定しております。

日時:10月5日(土)
場所:広島県広島市中区大手町 1-5-3 サテライトキャンパスひろしま 605号室

第二回 中国地方DB勉強会

こちらはOSC広島の前日に同じ場所(サテライトキャンパスひろしま)で開催します。
コンテンツに関しては

1 初心者向けのセッション
(SQLの書き方や実行計画の見方など)

2 運用に関するセッション
(バックアップやチューニングなど)

3 その他

を検討中です。
決まり次第、申し込みサイトとMLを更新していきますのでよろしくお願いします。
ということでまだまだ忙しくなりますが支部長業を頑張っていきます。
今度は広島の皆様、よろしくお願いします!!

(いや俺も広島県民だけどなんだけどね)