Laravel を使った開発
-はじめに
インディバルでは「ショットワークスコンビニ」というサービスを先日リリースしました。その中で、開発フレームワークLaravelを利用したのでその詳細について紹介します。
-環境
OS
amazon linux
使用言語
php 7.0.10
フレームワーク
Laravel 5.2
-フレームワーク選定
フレームワークの選定はこれまで別サービスでフレームワーク選定をした際に作られた資料をもとに
Laravel、phalconで検討しました。
Laravelは開発コミュニティが活発であること、柔軟性が高いこと、弊社別サービスでも採用されていること、phalconの強みである実行速度についてもphp7系で大幅に改善されることが見込めることからLaravelを採用しました。
-チーム構成
企画 1名
制作 2名
開発 2名
私自身は開発のメンバーです。
前述した開発の言語選定や環境構築、実装を担当しました。
-サードパーティ製のパッケージの追加
guzzle
predis
laravelcollective
aws-sdk-php
上記をcomposer を利用してインストールしておきました。
-利用頻度の高かった機能
フォームリクエスト
validateをこの機能に任せています。laravelcollectiveをインストールすることで使えるFormヘルパーと合わせて使うとルールの定義とテンプレートの記述だけで大体のことはやってくれるので便利です。
初回の定義がやや手間ではあるものの、改修作業が最近やっている中で楽だと感じることは多いです。
入力画面が複雑になってくると使えなくなってくるケースもありますが、入力→完了だけの場合や、戻って修正といった機能がない場合はとても楽にフォームを作ることが可能です。
サービスプロバイダー
S3の操作やPDF出力、エリアデータの取得モジュールなどコントローラーに依存しないモジュールはこの機能を使ってプロバイダーとして登録し、必要に応じてコントローラーから呼び出して利用しています。
機能毎に切り分けて登録しているため、コードが汚れにくいというメリットがあります。
ミドルウェア
route.php により画面のURLやコントローラーを指定していますが、権限によりページを出し分けるなど個別にルールを適用させる際に利用しました。各コントローラーで個別に処理を書く必要がなくなるため、実装が容易であり、可読性も高く作れることができました。
コンソール
バッチ処理系はまとめてコンソールを使うようにしています。
特段変わったことはしていませんが、cron 設定と似たようなこともlaravel のコードで書くことができるので統一しています。
DBのアクセス
モデルの採用も検討しましたが、テーブルの数からモデルの数が増えすぎることが予想されたこと、modelを利用したjoinは暗黙的にクエリを複数件投げることがあるためパフォーマンス面で不安があったことから、クエリビルダーを採用しています。
機能ごとにファイル分けして必要なコントローラー側からuse して使うようにしています。
php のtrait という機能を利用していて、laravel の標準認証コントローラーの実装方式を参考にしています。
-ディレクトリ構造のチラ見せ

基本的にはインストールした時点でのディレクトリ構造に、機能単位でモジュールをおいておくLib、DBアクセスモジュール郡のFoundation、Providerに登録したオブジェクトに別名を登録するためのFacadeを追加しています。Libディレクトリは各コントローラーから横断的に利用できるようになっています。
-フォームリクエストとlaravelcollective
フォームリクエストとlaravelcollectiveの実際の使い方は以下になります。
app/Http/Requests/直下にvaliadte定義をする◯◯Request.phpを作成します。
app/Http/Requests/OrderStoreRequest.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<?php namespace App\Http\Requests; use Illuminate\Contracts\Validation\Validator; class OrderStoreRequest extends Request { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() {return true;} protected function formatErrors(Validator $validator) {return parent::formatErrors($validator); // TODO: Change the autogenerated stub} /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'id' => 'numeric' ,'title' => 'min:1', ];}} |
-振り返り
前述したlaravel の機能を使うことで実装自体は非常に楽にできました。
可読性、拡張性、可用性を高く実装できたと考えています。