logo-idv ico_pp

Laravel を使った開発

エンジニア

img_column_engineer20160104

-はじめに

インディバルでは「ショットワークスコンビニ」というサービスを先日リリースしました。その中で、開発フレームワークLaravelを利用したのでその詳細について紹介します。

https://convini.shotworks.jp/

-環境

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 の標準認証コントローラーの実装方式を参考にしています。

-ディレクトリ構造のチラ見せ
画像1

基本的にはインストールした時点でのディレクトリ構造に、機能単位でモジュールをおいておくLib、DBアクセスモジュール郡のFoundation、Providerに登録したオブジェクトに別名を登録するためのFacadeを追加しています。Libディレクトリは各コントローラーから横断的に利用できるようになっています。

-フォームリクエストとlaravelcollective

フォームリクエストとlaravelcollectiveの実際の使い方は以下になります。
app/Http/Requests/直下にvaliadte定義をする◯◯Request.phpを作成します。

app/Http/Requests/OrderStoreRequest.php

-振り返り

前述したlaravel の機能を使うことで実装自体は非常に楽にできました。
可読性、拡張性、可用性を高く実装できたと考えています。

執筆者プロフィール

development室所属のS氏。最近ダイエットに成功し、シックスパックを目指す。猫好きな可愛い一面も兼ね備えている男の子