Slide 1

Slide 1 text

Laravel 5.1 LTS でサービス作る 2016 m-yamagishi Infiniteloop.

Slide 2

Slide 2 text

近況 [IL]山岸(capiba-)です 1〜2月は某バックエンドアプリケーションの管理画面を作っていました フレームワーク指定なしだったので Laravel 5.1 LTS にしました それまでは CakePHP2 による開発だったので快適すぎる環境に。

Slide 3

Slide 3 text

目次 1. Laravelとは a. 概要と特徴 b. 他フレームワークと比較 c. 機能一覧 2. Laravelの機能 a. 主要機能紹介 b. コンポーネント紹介

Slide 4

Slide 4 text

Laravel とは Laravel はオフィスに夜遅くまで残りた くない人のためのフレームワークです - Jeff Madsen

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

Laravel 特徴 ● 多種多様なバリデーションルールと容易な拡張性 ● 簡単に実現出来るページネーション(ページ付け) ● 柔軟なサービス(DI)コンテナ ● 使いやすく使用準備の手間が掛からない ORM ● 実行しやすいテスト Laravel リファレンス[Ver.5.1 LTS 対応] Web職人好みの新世代PHPフレームワーク - P 003

Slide 7

Slide 7 text

他のフレームワークと比較してみる vs

Slide 8

Slide 8 text

ベンチマーク 遅い https://github.com/kenjis/php-framework-benchmark 弟分のLumenはそこそこ

Slide 9

Slide 9 text

Google トレンド 人気爆発中

Slide 10

Slide 10 text

リポジトリ Symfony に次ぐ活発さ(コントリビュータ数、先月のコミット数) そもそも Laravel は Symfony のフレームワークの上に乗っている

Slide 11

Slide 11 text

検索 まあまああるみたい

Slide 12

Slide 12 text

フルスタックフレームワーク ● Homestead ● ルーティング ● ミドルウェア ● コントローラ ● リクエスト/レスポンス ● ビュー ● テンプレートエンジン ● サービスコンテナ ● コントラクト ● ファサード ● 認可と認証 ● コンソールコマンド ● 購入手続き ● キャッシュ ● コレクション ● ビルド自動化 ● 暗号化 ● エラー&ロギング ● イベント ● ファイルシステム ● ハッシュ ● ヘルパー ● 国際化 ● メール ● ページネーション ● キュー ● セッション ● テスト ● バリデーション ● クエリビルダ ● マイグレーション ● シーディング ● ORM とにかく全方面をカバー!

Slide 13

Slide 13 text

[結論] 今人気な 重量級(なんでもできちゃう&遅い) フレームワーク

Slide 14

Slide 14 text

Laravel の機能 豪華で 簡素で 読みやすい フルスタックはいいぞ。 - Laravelおじさん

Slide 15

Slide 15 text

Routing 1ファイル見ればそのサービスが見える

Slide 16

Slide 16 text

リダイレクト Routing クライアント リクエスト ミドルウェア コントローラ 処理の依頼 モデル DB 結果 結果 レスポンス リダイレクト クエリ

Slide 17

Slide 17 text

Routing app/Http/routes.php にクロージャで記述(Sinatra風) ←[ミドルウェア] コントローラ処理前後でやりたいことを記述 ←[プレフィックス]URLのプレフィックス ← /admin_users/edit/1 などでアクセスする

Slide 18

Slide 18 text

クロージャって 遅くない? でも大丈夫。Laravelならね。 - ???

Slide 19

Slide 19 text

artisan route:cache コマンド1個でルート設定クラスを文字列キャッシュするので高速

Slide 20

Slide 20 text

Controller / Request / Response この辺は普通すぎる処理しかないので割愛 よくあるMVCフレームワークのコントローラ ● ヘッダ指定 ● クッキー ● リダイレクト ● セッション ● フラッシュメッセージ ● JSON ● ファイル

Slide 21

Slide 21 text

Middleware 任意のコントローラの処理前・処理後に何かを行える ● 認証 - 未ログインならログイン画面にリダイレクトする ● 共有ビュー値 - 複数のページで共通のビュー値の設定 ● ロギング - リクエストが来たらログに書き込む ● レスポンス変換 - レスポンスの値を変換する(処理後) ● etc...

Slide 22

Slide 22 text

Service Container 欲しい時に欲しいもの(インスタンス)を用意してくれる頼もしい奴

Slide 23

Slide 23 text

Service Container とは ● インスタンスの生成と保持 ● 抽象化された要求の解決 ● コンストラクタ/メソッドインジェクション

Slide 24

Slide 24 text

...

Slide 25

Slide 25 text

わからん 1つ1つ見てみる

Slide 26

Slide 26 text

インスタンスの生成と保持 よくやる

Slide 27

Slide 27 text

インスタンスの生成と保持 依存インスタンスを作るの面倒

Slide 28

Slide 28 text

インスタンスの生成と保持 一回バインドすれば、クラス名を指定するだけでインスタンスを作って返してくれる!

Slide 29

Slide 29 text

抽象化された要求の解決 欲しいものを抽象化しておけば、状況に応じて 渡すインスタンスを変えることが可能になる

Slide 30

Slide 30 text

コンストラクタ/メソッドインジェクション フレームワーク側でインスタンス化・呼びだされるメソッドの引数にクラスをタイプヒンティン グすると、コンテナが自動的にインスタンスを用意してくれる

Slide 31

Slide 31 text

コンストラクタ/メソッドインジェクション 自分でインスタンスを用意する必要がない 全てはサービスコンテナが提供してくれる

Slide 32

Slide 32 text

Façade デザインパターンの奴ではない

Slide 33

Slide 33 text

Façade - ファサード 行いたい処理をどこからでも static メソッドとして呼べるクラス

Slide 34

Slide 34 text

え? static はテストしづらいし直しづら いし良いことないじゃん

Slide 35

Slide 35 text

え? static はテストしづらいし直しづら いし良いことないじゃん 心配ご無用!

Slide 36

Slide 36 text

Façade は Mockery を持つ Mockery というテスト用のモックオブジェクトを生成するライブラリを内包 テスト時に Mockery を事前定義しておけば、利用時に勝手にモックに置き換えてくれる “静的プロキシ” として利用可能な状態である

Slide 37

Slide 37 text

Query Builder メソッドチェーンでクエリを生成

Slide 38

Slide 38 text

Query Builder - クエリビルダ 最近の流行っぽい

Slide 39

Slide 39 text

Eloquent エ↑レクヮント : 雄弁な、能弁な

Slide 40

Slide 40 text

Eloquent - エレクヮント テーブルのリレーションや、カラムの型定義・変換などを担当 一般的な Active Record 形式の Model クラスと言える Query Builder を内包しているので、モデルに対してクエリを投げられる

Slide 41

Slide 41 text

Soft Deleting `\Illuminate\Database\Eloquent\SoftDeletes` トレイトを利用することで、 ソフトデリート(レコードに削除済み日時を乗せる)が利用可能になる `deleted_at` カラムの追加を必要とする

Slide 42

Slide 42 text

Query Scopes よく使われるWHERE条件などを事前に定義・命名出来る これが重要!!

Slide 43

Slide 43 text

Relations 1対1、1対多、多対多などのリレーションを実現する 定義 ←リレーション→

Slide 44

Slide 44 text

Relations 利用 プロパティとして取ればインスタンスが、メソッドとして取れば条件がついたクエリビルダが 取得出来る

Slide 45

Slide 45 text

Eager Loading - 熱心な読み込み Eloquent は JOIN ではなく別クエリを投げてリレーションを取得するので、 こういう書き方をすると つらい(N+1個の)SQLになる

Slide 46

Slide 46 text

Eager Loading - 熱心な読み込み 取得前に「このリレーションを利用する」と宣言しておけば、 オッケー

Slide 47

Slide 47 text

Eager Loading - 熱心な読み込み ネストしたリレーション読み込みも可能

Slide 48

Slide 48 text

Collection つまるところ便利な配列

Slide 49

Slide 49 text

Collection 通常配列やモデル配列に対して様々な処理を行えるクラス 便利メソッドがいっぱいなので、配列への複雑な処理をする場合は使いたい所

Slide 50

Slide 50 text

Blade 超☆シンプルテンプレートエンジン

Slide 51

Slide 51 text

Blade - テンプレートエンジン 超シンプルで、PHPコードの直埋め込みも許可している @if, @foreach, @extend, @include のような単純な制御文 {{ $name }} で変数自動エスケープ&表示 任意クラスのインジェクションも可能

Slide 52

Slide 52 text

Testing Laravel はテストが重要視されています

Slide 53

Slide 53 text

Testing Symfony の DomCrawler を内包し、擬似ブラウザテストが可能

Slide 54

Slide 54 text

Validation ちょっと配列を用意したら勝手に確認してくれます

Slide 55

Slide 55 text

Validation - バリデーション 所定の形式の配列を渡すと勝手にバリデートしてくれる

Slide 56

Slide 56 text

他コンポーネント 紹介 たくさんあるので大雑把に ● 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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

Artisan - アルティザン 単純なコンソールコマンド 既存コマンドも豊富で拡張も容易

Slide 59

Slide 59 text

Authentication - 認証 ● ユーザー登録 ● ログイン ● メールでパスワード再発行 ● BASIC認証 ● ソーシャル認証(Facebook, Twitter, LinkedIn, Google, Github, Bitbucker) が少しの実装で実現可能!

Slide 60

Slide 60 text

Authorization - 認可 この人はこのモデルを編集しても良い、追加は出来ない、などを表現可能 該当の記事を編集出来るか、このページを見れるか、様々な「○○出来るか」を単体で定 義出来る Policyクラスを定義して色々な場所で再利用 @can 記法でView中で利用することも簡単

Slide 61

Slide 61 text

Cache - キャッシュ 普通のキャッシュ file, database, memcached, redis から選べる デフォルトクロージャも出来る

Slide 62

Slide 62 text

Elixir - エリクサー gulp ラッパー SCSS/LESS/coffeescript/javascript などのリソースファイルを手軽にコンパイルし配置 出来る watch, バージョニング, ブラウザ同期等も備わっている

Slide 63

Slide 63 text

Encryption - 暗号化 複合可能な暗号化を行える

Slide 64

Slide 64 text

Events - イベント イベントドリブンな機能が実装出来る Pusherを使ってjsクライアントにブロードキャストしたりも可能

Slide 65

Slide 65 text

Filesystem / Cloud Storage /storages/app 内のファイル操作をうまいこと出来る s3も同じ記法で扱える

Slide 66

Slide 66 text

Hashing - ハッシュ化 復号化不要なユーザのパスワードなどを bcrypt 関数でハッシュ化出来る

Slide 67

Slide 67 text

ちょっと休憩 なんでも出来杉君だ これまでに見たコンポーネントおさらい ● Homestead : 全部入り開発用vagrant ● Artisan : アーティサンじゃなくてアルティザン ● Authentication : ログインは最初から実装済み ● Authorization : これは良い、これはダメ ● Cache : シンプル ● Elixir : フロントエンド開発も安心 ● Encryption : メソッドは2個だけ ● Events : プッシュ通知もできちゃう ● Filesystem : PHP関数はコワイから使わないで ● Hashing : 安全な暗号化

Slide 68

Slide 68 text

Helpers - ヘルパー 便利グローバル関数 array の拡張、 パスの取得、文字列の拡張、URL、その他ファサードでアクセス出来るよ うなコア機能

Slide 69

Slide 69 text

Localization - 多言語対応 php配列で言語ファイルを生成 trans ヘルパー関数で呼び出せる

Slide 70

Slide 70 text

Mail - メール SwiftMailer をラップしている 開発中はログに出力するドライバにしたり、Mailtrapを使うのが推奨されている

Slide 71

Slide 71 text

Migration - マイグレーション up/downをメソッドチェーン形式で書くだけの簡単なマイグレータ

Slide 72

Slide 72 text

Pagination - ページネイト クエリビルダやモデルでのレコード取得時に `paginate` メソッドを呼ぶと、勝手にページ ングしてくれる {!! $models->render() !!} とビューで呼ぶだけで、Bootstrap互換のページングリンクを貼ってくれる

Slide 73

Slide 73 text

Queue - キュー ジョブクラスを作成して、コントローラなどからキューを生成し、逐次実行していく コンソールコマンドをキュー化することも可能

Slide 74

Slide 74 text

Redis Redis に特化して実行出来るメソッドが提供されている

Slide 75

Slide 75 text

Session - セッション セッション変数を管理できる flash(一回表示したら消すメッセージ)なども対応している

Slide 76

Slide 76 text

SSH Tasks - SSHタスク Envoy を利用してSSH先でコマンド実行が出来る (機能が少なすぎて使いづらいから結局ansibleとか叩いた方が良い)

Slide 77

Slide 77 text

Task Scheduling つまり cronjob 。 定期実行するコマンドをPHPコード内に記述出来る スケジューリングの親プロセス自体はやっぱり cronjob に書く 出力をメールすることも出来る

Slide 78

Slide 78 text

まとめ ね?簡単でしょ?

Slide 79

Slide 79 text

Laravel は 富豪 のフレームワーク ● 実装の楽さを重視している ○ =実行速度は遅い ● 必要そうなものは最初からほぼ揃っている ○ キュー、メール、ファイル、暗号、テスト、バリデーション ... ● 速度をあまり求められない場所で、素早くリリースしたい場合に最適! ○ 逆に言うと、APIのようなアクセス頻度の高いものには使うべきではない ● 学習コストは低めだが、プロジェクト内での規約設定が重要 ○ Facade を使うのか、 helpers を使うのか、 Injection を使うのか、などの選択肢を決めておくこと

Slide 80

Slide 80 text

実行速度が重要だけど、 Laravelの○○を使いたい! という、欲張りなあなたに朗報

Slide 81

Slide 81 text

No content

Slide 82

Slide 82 text

Lumen とは 拡張性や柔軟性を捨てた代わりに速度を重視した版Laravel 大体の主要機能はそのまま使える コードベースの少ないページや、RESTful APIといった速度を求められるものの開発に 有効 Laravel で速度が欲しい一部機能を Lumen に切り出す、とかも効果的

Slide 83

Slide 83 text

参考資料 ● Phalcon ● Slim ● CodeIgniter ● Lumen ● Yii ● Silex ● FuelPHP ● CakePHP ● Symfony ● Laravel ● Zend Framework ● PHP Laravelの勉強中で出て来た新しい用語のまとめ | urashita.com ● LumenとLaravelの違い - ララ帳 ● Laravel 5.1 Official Docs aa

Slide 84

Slide 84 text

fin.