Laravel 5.1 LTS でサービス作る
2016 m-yamagishi Infiniteloop.
近況
[IL]山岸(capiba-)です
1〜2月は某バックエンドアプリケーションの管理画面を作っていました
フレームワーク指定なしだったので Laravel 5.1 LTS にしました
それまでは CakePHP2 による開発だったので快適すぎる環境に。
目次
1. Laravelとは
a. 概要と特徴
b. 他フレームワークと比較
c. 機能一覧
2. Laravelの機能
a. 主要機能紹介
b. コンポーネント紹介
Laravel とは Laravel はオフィスに夜遅くまで残りた
くない人のためのフレームワークです
- Jeff Madsen
Laravel 概要
MIT ライセンス
Laravel 1 は 2011/06 リリース -> Laravel 5 は 2015/02 リリース
Laravel 5.1 が初の LTS(Long Term Support)
Symfony フレームワークの機能を利用している
メインデベロッパの Taylor Otwell 氏は元 .NET の中の人
「幸せな開発者が最高のコードを書く[1]」が基本哲学
[1]: Laravel リファレンス[Ver.5.1 LTS 対応] Web職人好みの新世代PHPフレームワーク - P 002
Laravel 特徴
● 多種多様なバリデーションルールと容易な拡張性
● 簡単に実現出来るページネーション(ページ付け)
● 柔軟なサービス(DI)コンテナ
● 使いやすく使用準備の手間が掛からない ORM
● 実行しやすいテスト
Laravel リファレンス[Ver.5.1 LTS 対応] Web職人好みの新世代PHPフレームワーク - P 003
他のフレームワークと比較してみる
vs
ベンチマーク
遅い
https://github.com/kenjis/php-framework-benchmark
弟分のLumenはそこそこ
Google トレンド
人気爆発中
リポジトリ
Symfony に次ぐ活発さ(コントリビュータ数、先月のコミット数)
そもそも Laravel は Symfony のフレームワークの上に乗っている
検索
まあまああるみたい
フルスタックフレームワーク
● Homestead
● ルーティング
● ミドルウェア
● コントローラ
● リクエスト/レスポンス
● ビュー
● テンプレートエンジン
● サービスコンテナ
● コントラクト
● ファサード
● 認可と認証
● コンソールコマンド
● 購入手続き
● キャッシュ
● コレクション
● ビルド自動化
● 暗号化
● エラー&ロギング
● イベント
● ファイルシステム
● ハッシュ
● ヘルパー
● 国際化
● メール
● ページネーション
● キュー
● セッション
● テスト
● バリデーション
● クエリビルダ
● マイグレーション
● シーディング
● ORM
とにかく全方面をカバー!
[結論]
今人気な
重量級(なんでもできちゃう&遅い)
フレームワーク
Laravel の機能
豪華で
簡素で
読みやすい
フルスタックはいいぞ。
- Laravelおじさん
Routing
1ファイル見ればそのサービスが見える
リダイレクト
Routing クライアント
リクエスト
ミドルウェア
コントローラ
処理の依頼
モデル
DB
結果
結果
レスポンス
リダイレクト
クエリ
Routing
app/Http/routes.php にクロージャで記述(Sinatra風)
←[ミドルウェア] コントローラ処理前後でやりたいことを記述
←[プレフィックス]URLのプレフィックス
← /admin_users/edit/1 などでアクセスする
クロージャって
遅くない? でも大丈夫。Laravelならね。
- ???
artisan route:cache
コマンド1個でルート設定クラスを文字列キャッシュするので高速
Controller / Request / Response
この辺は普通すぎる処理しかないので割愛
よくあるMVCフレームワークのコントローラ
● ヘッダ指定
● クッキー
● リダイレクト
● セッション
● フラッシュメッセージ
● JSON
● ファイル
Middleware
任意のコントローラの処理前・処理後に何かを行える
● 認証 - 未ログインならログイン画面にリダイレクトする
● 共有ビュー値 - 複数のページで共通のビュー値の設定
● ロギング - リクエストが来たらログに書き込む
● レスポンス変換 - レスポンスの値を変換する(処理後)
● etc...
Service Container
欲しい時に欲しいもの(インスタンス)を用意してくれる頼もしい奴
Service Container とは
● インスタンスの生成と保持
● 抽象化された要求の解決
● コンストラクタ/メソッドインジェクション
...
わからん
1つ1つ見てみる
インスタンスの生成と保持
よくやる
インスタンスの生成と保持
依存インスタンスを作るの面倒
インスタンスの生成と保持
一回バインドすれば、クラス名を指定するだけでインスタンスを作って返してくれる!
抽象化された要求の解決
欲しいものを抽象化しておけば、状況に応じて
渡すインスタンスを変えることが可能になる
コンストラクタ/メソッドインジェクション
フレームワーク側でインスタンス化・呼びだされるメソッドの引数にクラスをタイプヒンティン
グすると、コンテナが自動的にインスタンスを用意してくれる
コンストラクタ/メソッドインジェクション
自分でインスタンスを用意する必要がない
全てはサービスコンテナが提供してくれる
Façade
デザインパターンの奴ではない
Façade - ファサード
行いたい処理をどこからでも static メソッドとして呼べるクラス
え?
static はテストしづらいし直しづら
いし良いことないじゃん
え?
static はテストしづらいし直しづら
いし良いことないじゃん
心配ご無用!
Façade は Mockery を持つ
Mockery というテスト用のモックオブジェクトを生成するライブラリを内包
テスト時に Mockery を事前定義しておけば、利用時に勝手にモックに置き換えてくれる
“静的プロキシ” として利用可能な状態である
Query Builder
メソッドチェーンでクエリを生成
Query Builder - クエリビルダ
最近の流行っぽい
Eloquent
エ↑レクヮント : 雄弁な、能弁な
Eloquent - エレクヮント
テーブルのリレーションや、カラムの型定義・変換などを担当
一般的な Active Record 形式の Model クラスと言える
Query Builder を内包しているので、モデルに対してクエリを投げられる
Soft Deleting
`IlluminateDatabaseEloquentSoftDeletes` トレイトを利用することで、
ソフトデリート(レコードに削除済み日時を乗せる)が利用可能になる
`deleted_at` カラムの追加を必要とする
Query Scopes
よく使われるWHERE条件などを事前に定義・命名出来る
これが重要!!
Relations
1対1、1対多、多対多などのリレーションを実現する
定義
←リレーション→
Relations
利用
プロパティとして取ればインスタンスが、メソッドとして取れば条件がついたクエリビルダが
取得出来る
Eager Loading - 熱心な読み込み
Eloquent は JOIN ではなく別クエリを投げてリレーションを取得するので、
こういう書き方をすると
つらい(N+1個の)SQLになる
Eager Loading - 熱心な読み込み
取得前に「このリレーションを利用する」と宣言しておけば、
オッケー
Eager Loading - 熱心な読み込み
ネストしたリレーション読み込みも可能
Collection
つまるところ便利な配列
Collection
通常配列やモデル配列に対して様々な処理を行えるクラス
便利メソッドがいっぱいなので、配列への複雑な処理をする場合は使いたい所
Blade
超☆シンプルテンプレートエンジン
Blade - テンプレートエンジン
超シンプルで、PHPコードの直埋め込みも許可している
@if, @foreach, @extend, @include のような単純な制御文
{{ $name }} で変数自動エスケープ&表示
任意クラスのインジェクションも可能
Testing
Laravel はテストが重要視されています
Testing
Symfony の DomCrawler を内包し、擬似ブラウザテストが可能
Validation
ちょっと配列を用意したら勝手に確認してくれます
Validation - バリデーション
所定の形式の配列を渡すと勝手にバリデートしてくれる
他コンポーネント
紹介
たくさんあるので大雑把に
● Homestead : 全部入り開発用vagrant
● Artisan : アーティサンじゃなくてアルティザン
● Authentication : ログインは最初から実装済み
● Authorization : これは良い、これはダメ
● Cache : シンプル
● Elixir : フロントエンド開発も安心
● Encryption : メソッドは2個だけ
● Events : プッシュ通知もできちゃう
● Filesystem : PHP関数はコワイから使わない
で
● Hashing : 安全な暗号化
● Helpers : どこでも便利に
● Localization : 外国でもOK
● Mail : テストもしやすい
● Migration : シンプルなマイグレータ
● Pagination : 全自動
● Queue : 後から処理出来るものは後から
● Redis : 使いこなそう
● Session : セッション
● SSH Tasks : (これはまあなくても...)
● Task Scheduling : cronjob 直書きはNG
Homestead
開発用VM
必要なもの全部入りなvagrant
● Ubuntu 14.04
● Git
● PHP 7.0
● Xdebug
● HHVM
● Nginx
● MySQL / Mariadb
● Sqlite3
● Postgres
● Composer
● Node (With PM2, Bower, Grunt, and Gulp)
● Redis
● Memcached (PHP 5.x Only)
● Beanstalkd
Artisan - アルティザン
単純なコンソールコマンド
既存コマンドも豊富で拡張も容易
Authentication - 認証
● ユーザー登録
● ログイン
● メールでパスワード再発行
● BASIC認証
● ソーシャル認証(Facebook, Twitter, LinkedIn, Google, Github, Bitbucker)
が少しの実装で実現可能!
Authorization - 認可
この人はこのモデルを編集しても良い、追加は出来ない、などを表現可能
該当の記事を編集出来るか、このページを見れるか、様々な「○○出来るか」を単体で定
義出来る
Policyクラスを定義して色々な場所で再利用
@can 記法でView中で利用することも簡単
Cache - キャッシュ
普通のキャッシュ
file, database, memcached, redis から選べる
デフォルトクロージャも出来る
Elixir - エリクサー
gulp ラッパー
SCSS/LESS/coffeescript/javascript などのリソースファイルを手軽にコンパイルし配置
出来る
watch, バージョニング, ブラウザ同期等も備わっている
Encryption - 暗号化
複合可能な暗号化を行える
Events - イベント
イベントドリブンな機能が実装出来る
Pusherを使ってjsクライアントにブロードキャストしたりも可能
Filesystem / Cloud Storage
/storages/app 内のファイル操作をうまいこと出来る
s3も同じ記法で扱える
Hashing - ハッシュ化
復号化不要なユーザのパスワードなどを bcrypt 関数でハッシュ化出来る
ちょっと休憩
なんでも出来杉君だ
これまでに見たコンポーネントおさらい
● Homestead : 全部入り開発用vagrant
● Artisan : アーティサンじゃなくてアルティザン
● Authentication : ログインは最初から実装済み
● Authorization : これは良い、これはダメ
● Cache : シンプル
● Elixir : フロントエンド開発も安心
● Encryption : メソッドは2個だけ
● Events : プッシュ通知もできちゃう
● Filesystem : PHP関数はコワイから使わないで
● Hashing : 安全な暗号化
Helpers - ヘルパー
便利グローバル関数
array の拡張、 パスの取得、文字列の拡張、URL、その他ファサードでアクセス出来るよ
うなコア機能
Localization - 多言語対応
php配列で言語ファイルを生成
trans ヘルパー関数で呼び出せる
Mail - メール
SwiftMailer をラップしている
開発中はログに出力するドライバにしたり、Mailtrapを使うのが推奨されている
Migration - マイグレーション
up/downをメソッドチェーン形式で書くだけの簡単なマイグレータ
Pagination - ページネイト
クエリビルダやモデルでのレコード取得時に `paginate` メソッドを呼ぶと、勝手にページ
ングしてくれる
{!! $models->render() !!}
とビューで呼ぶだけで、Bootstrap互換のページングリンクを貼ってくれる
Queue - キュー
ジョブクラスを作成して、コントローラなどからキューを生成し、逐次実行していく
コンソールコマンドをキュー化することも可能
Redis
Redis に特化して実行出来るメソッドが提供されている
Session - セッション
セッション変数を管理できる
flash(一回表示したら消すメッセージ)なども対応している
SSH Tasks - SSHタスク
Envoy を利用してSSH先でコマンド実行が出来る
(機能が少なすぎて使いづらいから結局ansibleとか叩いた方が良い)
Task Scheduling
つまり cronjob 。
定期実行するコマンドをPHPコード内に記述出来る
スケジューリングの親プロセス自体はやっぱり cronjob に書く
出力をメールすることも出来る
まとめ
ね?簡単でしょ?
Laravel は 富豪 のフレームワーク
● 実装の楽さを重視している
○ =実行速度は遅い
● 必要そうなものは最初からほぼ揃っている
○ キュー、メール、ファイル、暗号、テスト、バリデーション ...
● 速度をあまり求められない場所で、素早くリリースしたい場合に最適!
○ 逆に言うと、APIのようなアクセス頻度の高いものには使うべきではない
● 学習コストは低めだが、プロジェクト内での規約設定が重要
○ Facade を使うのか、 helpers を使うのか、 Injection を使うのか、などの選択肢を決めておくこと
実行速度が重要だけど、
Laravelの○○を使いたい!
という、欲張りなあなたに朗報
Lumen とは
拡張性や柔軟性を捨てた代わりに速度を重視した版Laravel
大体の主要機能はそのまま使える
コードベースの少ないページや、RESTful APIといった速度を求められるものの開発に
有効
Laravel で速度が欲しい一部機能を Lumen に切り出す、とかも効果的
参考資料
● Phalcon
● Slim
● CodeIgniter
● Lumen
● Yii
● Silex
● FuelPHP
● CakePHP
● Symfony
● Laravel
● Zend Framework
● PHP Laravelの勉強中で出て来た新しい用語のまとめ | urashita.com
● LumenとLaravelの違い - ララ帳
● Laravel 5.1 Official Docs
aa
fin.

Laravel 5.1 LTSでサービスを作る