こんにちは、レバレジーズシステムチームの市川です。
PHPエンジニアの皆さん、Laravel使ってますか?
昨年くらいから日本でも話題に上がることが多くなったLaravelですが、
弊社でも今年に入って作ったいくつかの媒体はLaravel4で構築しました。
社内で誰も使ったことがない状態から始まったLaravelの導入。
それから半年間、私たちは数々の失敗と試行錯誤を繰り返し、少しずつLaravelと仲良くなっていきました。
今回は、その過程で学んできたことを幾つか紹介していきます。
これからLaravelでの開発を考えているエンジニアさんのお役にたてれば幸いです。
※以下で紹介していくのはLaravel4.1の話になります。
◆︎環境の切り替え
通常Webシステムを開発していく場合、開発環境、ステージング環境、本番環境など色々な環境にわかれることになると思います。実はLaravelでは環境別設定が簡単に実現できます。
インストールして直ぐの状態ではapp/config配下に様々な設定ファイルとlocal、testingなどの環境別設定用のディレクトリがあります。
- config配下・・・本番環境用の設定
- local・・・開発環境用の設定
- testing・・・テスト時の設定
となります。
例えばここにステージング環境用の設定を加えたいという場合はapp/config配下にstagingというディレクトリを作成し、変更したい設定ファイルを置きます。
ちなみにlocal、stagingなどに置いた設定ファイルの内容は本番環境の設定をオーバーライドする形になるので変更したいファイルだけを置き、変更したい内容のみを記述するだけでOKです。
・configファイルの切り替え
環境の切り替えはbootstrap/start.phpで行っています。
基本はマシン名やURIでの切り替えになりますが、環境変数で切り替えを行うのもおすすめです。
$env = $app->detectEnvironment(function () use ($app) {
if (getenv('APP_ENV')) return getenv('APP_ENV');
return $app->detectEnvironment([
'development' => array('*.dev', '*.localhost', '*.local')
]);
});
・パスワードなどの重要な情報の管理
データベースのパスワードなどの情報は設定ファイルからわけて管理したい場合もあると思います。そういった機密情報は.envファイルを活用して設定を行いましょう。
ルート配下に.env.phpを作成し
<?php
return [
'DATABASE_PW' => 'password',
'API_KEY' => 'api_key',
];
のようにすると、$_ENV[‘DATABASE_PW’]のように参照することができるので、
'pgsql' => array(
'password' => $_ENV['DATABASE_PW'],
のように設定することができます。
環境別の設定を行う場合は.env.[環境名].php(例:.env.local.php)というファイル名で作成することで実現可能です。
※.envファイルは必ず.gitignoreファイルに加えましょう。バージョン管理をしてしまっては意味がありません。
◆実装するにあたって注意したい点
・Paginationについて
Webの3大闇の1つとも言われるページャーですが、Laravelでは比較的簡単に実装することが可能です。
しかし、通常のまま使うにはlinks()などのメソッドで生成されるタグにCSSを合わせたり、ページ指定はパラメーターでp=123のような形にしたりとページャーの仕様にプロダクトを合わせる必要があります。
※実際には、色々とCSSの指定をする必要があったり、ページ指定は/example/123/のようにURL部分に含む必要があったりと様々な要求に答えなければいけないことも多くなってきます。そんな時はIlluminate\Pagination\Presenter を拡張してカスタムプレゼンターを作成し、闇と戦いましょう。
・Eloquentで全てをやろうとしない
Eloquentはとてもパワフルで生産性をアップさせるすばらしい機能です。ですが、その分内部で実装されている内容が複雑になっておりPDOを直接使うより遅くなります。
大量のデータを扱ったり、パフォーマンスが求められる場面では他の方法を検討する方が無難です。
基本的には以下の順で早くなっています。
Eloquent < クエリビルダー «< PDO
PDOを拡張しているので当たり前ですが。。。
・トレイリングスラッシュについて
URLは基本的に/exampleか/example/のどちらかに統一するのが通常かと思いますが、Laravelは/なしの方に寄せるほうが断然楽です。開発が始まる前になくなるように根回ししましょう。
◆︎プラグインの紹介
Laravelと一緒に使いたい、便利なプラグインの紹介します。
・laravel-ide-helper
PHPStormやNetBeansなどのIDEで開発を行っている方も多いと思いますが
特になにもしていないとIocコンテナで登録したクラスのメソッドなどは補完が効きません。
コード補完できなかったらIDEを使う意味も半減ですのでこれを使わない手はありません。
開発効率が飛躍的に向上すること間違いなしです!
・laravel-debugbar
デバッグする場合には色々な場所にvar_dumpやログを仕込むのもいいですが、
このlaravel-debugbarはリクエストの内容や発行されたクエリ、実行時間などの情報を表示してくれます。
app/config/app.phpのdebugでON/OFF切り替えできるので開発環境と本番環境で設定を分けておけば本番で表示されることもありません。
・TwigBridge
人によってはLaravelのデフォルトテンプレートエンジンBladeが
「気に入らない!@が気持ち悪い!twigが使いたいんだ!」という方もいると思います。
そんな方にはこのTwigBridgeを使うことでtwigでもLaravelのFormヘルパーなどが使用できるようになります。
◆まとめ
Laravelはここ数年すごい勢いで情報量が増えています。日本語の情報も増えて導入するハードルも下がってきたのではないでしょうか。
ですが、cakeやsymfonyに比べてまだまだ実際に導入しているという話は少ないように感じます。
みなさんのプロダクトでもLaravelを使って盛り上げていきましょう!
※︎おまけ
・Laravelの次期バージョンLaravel5.0は2014年の11月〜年末あたりを目処にリリース予定のようです。次期バージョンではMethod InjectionやElixirなどの新機能が導入されてますますパワフルになるとのこと。一方でディレクトリ構造などが大幅に変わったりFormRequest、Kernel・middlewareなど新しい概念を覚える必要があるようなので、今からLaravelでプロダクトを始めようとしている方は悩みどころですね。
・11/11にLaravelのCSRFフィルターに脆弱性が見つかりました。
4.2.10以前のバージョンを使用している場合はapp/filters.phpを以下の用に!=から!==に変更してください。
Route::filter('csrf', function()
{
- if (Session::token() != Input::get('_token'))
+ if (Session::token() !== Input::get('_token'))