laravel 5.1 ltsでサービスを作る

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

Upload: infiniteloop

Post on 07-Jan-2017

5.414 views

Category:

Software


15 download

TRANSCRIPT

Page 1: Laravel 5.1 LTSでサービスを作る

Laravel 5.1 LTS でサービス作る

2016 m-yamagishi Infiniteloop.

Page 2: Laravel 5.1 LTSでサービスを作る

近況

[IL]山岸(capiba-)です

1〜2月は某バックエンドアプリケーションの管理画面を作っていました

フレームワーク指定なしだったので Laravel 5.1 LTS にしました

それまでは CakePHP2 による開発だったので快適すぎる環境に。

Page 3: Laravel 5.1 LTSでサービスを作る

目次

1. Laravelとは

a. 概要と特徴

b. 他フレームワークと比較

c. 機能一覧

2. Laravelの機能

a. 主要機能紹介

b. コンポーネント紹介

Page 4: Laravel 5.1 LTSでサービスを作る

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

- Jeff Madsen

Page 5: Laravel 5.1 LTSでサービスを作る

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

Page 6: Laravel 5.1 LTSでサービスを作る

Laravel 特徴

● 多種多様なバリデーションルールと容易な拡張性

● 簡単に実現出来るページネーション(ページ付け)

● 柔軟なサービス(DI)コンテナ

● 使いやすく使用準備の手間が掛からない ORM

● 実行しやすいテスト

Laravel リファレンス[Ver.5.1 LTS 対応] Web職人好みの新世代PHPフレームワーク - P 003

Page 7: Laravel 5.1 LTSでサービスを作る

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

vs

Page 8: Laravel 5.1 LTSでサービスを作る

ベンチマーク

遅い

https://github.com/kenjis/php-framework-benchmark

弟分のLumenはそこそこ

Page 9: Laravel 5.1 LTSでサービスを作る

Google トレンド

人気爆発中

Page 10: Laravel 5.1 LTSでサービスを作る

リポジトリ

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

Page 11: Laravel 5.1 LTSでサービスを作る

検索

まあまああるみたい

Page 12: Laravel 5.1 LTSでサービスを作る

フルスタックフレームワーク● Homestead● ルーティング

● ミドルウェア

● コントローラ

● リクエスト/レスポンス

● ビュー

● テンプレートエンジン

● サービスコンテナ

● コントラクト

● ファサード

● 認可と認証

● コンソールコマンド

● 購入手続き

● キャッシュ

● コレクション

● ビルド自動化

● 暗号化

● エラー&ロギング

● イベント

● ファイルシステム

● ハッシュ

● ヘルパー

● 国際化

● メール

● ページネーション

● キュー

● セッション

● テスト

● バリデーション

● クエリビルダ

● マイグレーション

● シーディング

● ORM

とにかく全方面をカバー!

Page 13: Laravel 5.1 LTSでサービスを作る

[結論]今人気な重量級(なんでもできちゃう&遅い)

フレームワーク

Page 14: Laravel 5.1 LTSでサービスを作る

Laravel の機能

豪華で簡素で

読みやすい

フルスタックはいいぞ。

- Laravelおじさん

Page 15: Laravel 5.1 LTSでサービスを作る

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

Page 16: Laravel 5.1 LTSでサービスを作る

リダイレクト

Routing クライアント

リクエスト

ミドルウェア

コントローラ

処理の依頼

モデル

DB

結果

結果

レスポンス

リダイレクト

クエリ

Page 17: Laravel 5.1 LTSでサービスを作る

Routingapp/Http/routes.php にクロージャで記述(Sinatra風)

←[ミドルウェア ] コントローラ処理前後でやりたいことを記述

←[プレフィックス ]URLのプレフィックス

← /admin_users/edit/1 などでアクセスする

Page 18: Laravel 5.1 LTSでサービスを作る

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

- ???

Page 19: Laravel 5.1 LTSでサービスを作る

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

Page 20: Laravel 5.1 LTSでサービスを作る

Controller / Request / Responseこの辺は普通すぎる処理しかないので割愛

よくあるMVCフレームワークのコントローラ

● ヘッダ指定

● クッキー

● リダイレクト

● セッション

● フラッシュメッセージ

● JSON● ファイル

Page 21: Laravel 5.1 LTSでサービスを作る

Middleware任意のコントローラの処理前・処理後に何かを行える

● 認証 - 未ログインならログイン画面にリダイレクトする

● 共有ビュー値 - 複数のページで共通のビュー値の設定

● ロギング - リクエストが来たらログに書き込む

● レスポンス変換 - レスポンスの値を変換する(処理後)● etc...

Page 22: Laravel 5.1 LTSでサービスを作る

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

Page 23: Laravel 5.1 LTSでサービスを作る

Service Container とは● インスタンスの生成と保持

● 抽象化された要求の解決

● コンストラクタ/メソッドインジェクション

Page 24: Laravel 5.1 LTSでサービスを作る

...

Page 25: Laravel 5.1 LTSでサービスを作る

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

Page 26: Laravel 5.1 LTSでサービスを作る

インスタンスの生成と保持

よくやる

Page 27: Laravel 5.1 LTSでサービスを作る

インスタンスの生成と保持

依存インスタンスを作るの面倒

Page 28: Laravel 5.1 LTSでサービスを作る

インスタンスの生成と保持

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

Page 29: Laravel 5.1 LTSでサービスを作る

抽象化された要求の解決

欲しいものを抽象化しておけば、状況に応じて

渡すインスタンスを変えることが可能になる

Page 30: Laravel 5.1 LTSでサービスを作る

コンストラクタ/メソッドインジェクション

フレームワーク側でインスタンス化・呼びだされるメソッドの引数にクラスをタイプヒンティン

グすると、コンテナが自動的にインスタンスを用意してくれる

Page 31: Laravel 5.1 LTSでサービスを作る

コンストラクタ/メソッドインジェクション

自分でインスタンスを用意する必要がない

全てはサービスコンテナが提供してくれる

Page 32: Laravel 5.1 LTSでサービスを作る

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

Page 33: Laravel 5.1 LTSでサービスを作る

Façade - ファサード

行いたい処理をどこからでも static メソッドとして呼べるクラス

Page 34: Laravel 5.1 LTSでサービスを作る

え?static はテストしづらいし直しづら

いし良いことないじゃん

Page 35: Laravel 5.1 LTSでサービスを作る

え?static はテストしづらいし直しづら

いし良いことないじゃん

心配ご無用!

Page 36: Laravel 5.1 LTSでサービスを作る

Façade は Mockery を持つ

Mockery というテスト用のモックオブジェクトを生成するライブラリを内包

テスト時に Mockery を事前定義しておけば、利用時に勝手にモックに置き換えてくれる

“静的プロキシ” として利用可能な状態である

Page 37: Laravel 5.1 LTSでサービスを作る

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

Page 38: Laravel 5.1 LTSでサービスを作る

Query Builder - クエリビルダ

最近の流行っぽい

Page 39: Laravel 5.1 LTSでサービスを作る

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

Page 40: Laravel 5.1 LTSでサービスを作る

Eloquent - エレクヮント

テーブルのリレーションや、カラムの型定義・変換などを担当

一般的な Active Record 形式の Model クラスと言える

Query Builder を内包しているので、モデルに対してクエリを投げられる

Page 41: Laravel 5.1 LTSでサービスを作る

Soft Deleting`\Illuminate\Database\Eloquent\SoftDeletes` トレイトを利用することで、

ソフトデリート(レコードに削除済み日時を乗せる)が利用可能になる

`deleted_at` カラムの追加を必要とする

Page 42: Laravel 5.1 LTSでサービスを作る

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

これが重要!!

Page 43: Laravel 5.1 LTSでサービスを作る

Relations1対1、1対多、多対多などのリレーションを実現する

定義

←リレーション→

Page 44: Laravel 5.1 LTSでサービスを作る

Relations利用

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

取得出来る

Page 45: Laravel 5.1 LTSでサービスを作る

Eager Loading - 熱心な読み込み

Eloquent は JOIN ではなく別クエリを投げてリレーションを取得するので、

こういう書き方をすると

つらい(N+1個の)SQLになる

Page 46: Laravel 5.1 LTSでサービスを作る

Eager Loading - 熱心な読み込み

取得前に「このリレーションを利用する」と宣言しておけば、

オッケー

Page 47: Laravel 5.1 LTSでサービスを作る

Eager Loading - 熱心な読み込み

ネストしたリレーション読み込みも可能

Page 48: Laravel 5.1 LTSでサービスを作る

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

Page 49: Laravel 5.1 LTSでサービスを作る

Collection

通常配列やモデル配列に対して様々な処理を行えるクラス

便利メソッドがいっぱいなので、配列への複雑な処理をする場合は使いたい所

Page 50: Laravel 5.1 LTSでサービスを作る

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

Page 51: Laravel 5.1 LTSでサービスを作る

Blade - テンプレートエンジン

超シンプルで、PHPコードの直埋め込みも許可している

@if, @foreach, @extend, @include のような単純な制御文

{{ $name }} で変数自動エスケープ&表示

任意クラスのインジェクションも可能

Page 52: Laravel 5.1 LTSでサービスを作る

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

Page 53: Laravel 5.1 LTSでサービスを作る

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

Page 54: Laravel 5.1 LTSでサービスを作る

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

Page 55: Laravel 5.1 LTSでサービスを作る

Validation - バリデーション

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

Page 56: Laravel 5.1 LTSでサービスを作る

他コンポーネント紹介

たくさんあるので大雑把に

● 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

Page 57: Laravel 5.1 LTSでサービスを作る

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

Page 58: Laravel 5.1 LTSでサービスを作る

Artisan - アルティザン

単純なコンソールコマンド

既存コマンドも豊富で拡張も容易

Page 59: Laravel 5.1 LTSでサービスを作る

Authentication - 認証

● ユーザー登録

● ログイン

● メールでパスワード再発行

● BASIC認証

● ソーシャル認証(Facebook, Twitter, LinkedIn, Google, Github, Bitbucker)

が少しの実装で実現可能!

Page 60: Laravel 5.1 LTSでサービスを作る

Authorization - 認可

この人はこのモデルを編集しても良い、追加は出来ない、などを表現可能

該当の記事を編集出来るか、このページを見れるか、様々な「○○出来るか」を単体で定

義出来る

Policyクラスを定義して色々な場所で再利用

@can 記法でView中で利用することも簡単

Page 61: Laravel 5.1 LTSでサービスを作る

Cache - キャッシュ

普通のキャッシュ

file, database, memcached, redis から選べる

デフォルトクロージャも出来る

Page 62: Laravel 5.1 LTSでサービスを作る

Elixir - エリクサー

gulp ラッパー

SCSS/LESS/coffeescript/javascript などのリソースファイルを手軽にコンパイルし配置

出来る

watch, バージョニング, ブラウザ同期等も備わっている

Page 63: Laravel 5.1 LTSでサービスを作る

Encryption - 暗号化

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

Page 64: Laravel 5.1 LTSでサービスを作る

Events - イベント

イベントドリブンな機能が実装出来る

Pusherを使ってjsクライアントにブロードキャストしたりも可能

Page 65: Laravel 5.1 LTSでサービスを作る

Filesystem / Cloud Storage/storages/app 内のファイル操作をうまいこと出来る

s3も同じ記法で扱える

Page 66: Laravel 5.1 LTSでサービスを作る

Hashing - ハッシュ化

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

Page 67: Laravel 5.1 LTSでサービスを作る

ちょっと休憩なんでも出来杉君だ

これまでに見たコンポーネントおさらい

● Homestead : 全部入り開発用vagrant

● Artisan : アーティサンじゃなくてアルティザン

● Authentication : ログインは最初から実装済み

● Authorization : これは良い、これはダメ

● Cache : シンプル

● Elixir : フロントエンド開発も安心

● Encryption : メソッドは2個だけ

● Events : プッシュ通知もできちゃう

● Filesystem : PHP関数はコワイから使わないで

● Hashing : 安全な暗号化

Page 68: Laravel 5.1 LTSでサービスを作る

Helpers - ヘルパー

便利グローバル関数

array の拡張、 パスの取得、文字列の拡張、URL、その他ファサードでアクセス出来るよ

うなコア機能

Page 69: Laravel 5.1 LTSでサービスを作る

Localization - 多言語対応

php配列で言語ファイルを生成

trans ヘルパー関数で呼び出せる

Page 70: Laravel 5.1 LTSでサービスを作る

Mail - メール

SwiftMailer をラップしている

開発中はログに出力するドライバにしたり、Mailtrapを使うのが推奨されている

Page 71: Laravel 5.1 LTSでサービスを作る

Migration - マイグレーション

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

Page 72: Laravel 5.1 LTSでサービスを作る

Pagination - ページネイト

クエリビルダやモデルでのレコード取得時に `paginate` メソッドを呼ぶと、勝手にページ

ングしてくれる

{!! $models->render() !!}

とビューで呼ぶだけで、Bootstrap互換のページングリンクを貼ってくれる

Page 73: Laravel 5.1 LTSでサービスを作る

Queue - キュー

ジョブクラスを作成して、コントローラなどからキューを生成し、逐次実行していく

コンソールコマンドをキュー化することも可能

Page 74: Laravel 5.1 LTSでサービスを作る

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

Page 75: Laravel 5.1 LTSでサービスを作る

Session - セッション

セッション変数を管理できる

flash(一回表示したら消すメッセージ)なども対応している

Page 76: Laravel 5.1 LTSでサービスを作る

SSH Tasks - SSHタスク

Envoy を利用してSSH先でコマンド実行が出来る

(機能が少なすぎて使いづらいから結局ansibleとか叩いた方が良い)

Page 77: Laravel 5.1 LTSでサービスを作る

Task Schedulingつまり cronjob 。

定期実行するコマンドをPHPコード内に記述出来る

スケジューリングの親プロセス自体はやっぱり cronjob に書く

出力をメールすることも出来る

Page 78: Laravel 5.1 LTSでサービスを作る

まとめね?簡単でしょ?

Page 79: Laravel 5.1 LTSでサービスを作る

Laravel は 富豪 のフレームワーク

● 実装の楽さを重視している

○ =実行速度は遅い

● 必要そうなものは最初からほぼ揃っている

○ キュー、メール、ファイル、暗号、テスト、バリデーション ...

● 速度をあまり求められない場所で、素早くリリースしたい場合に最適!

○ 逆に言うと、APIのようなアクセス頻度の高いものには使うべきではない

● 学習コストは低めだが、プロジェクト内での規約設定が重要

○ Facade を使うのか、 helpers を使うのか、 Injection を使うのか、などの選択肢を決めておくこと

Page 80: Laravel 5.1 LTSでサービスを作る

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

Page 81: Laravel 5.1 LTSでサービスを作る
Page 82: Laravel 5.1 LTSでサービスを作る

Lumen とは拡張性や柔軟性を捨てた代わりに速度を重視した版Laravel

大体の主要機能はそのまま使える

コードベースの少ないページや、RESTful APIといった速度を求められるものの開発に

有効

Laravel で速度が欲しい一部機能を Lumen に切り出す、とかも効果的

Page 84: Laravel 5.1 LTSでサービスを作る

fin.