laravel5を使って開発してみた
TRANSCRIPT
![Page 1: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/1.jpg)
Laravel5を使って開発してみた
2015/06/27
株式会社セブンメディア 野田健夫
![Page 2: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/2.jpg)
2こんにちは!
野田健夫(のだたけお)https://twitter.com/nodatakeo
https://www.facebook.com/nodatakeo
株式会社セブンメディア チーフアーキテクト
![Page 3: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/3.jpg)
3会社について
■社名 株式会社セブンメディア(英語表記: Sevenmedia,Inc.)
■所在地 〒108-0073 東京都港区三田3-9-7 三田三好ビル5F
■設立 2011年9月
■代表取締役 田村 順一
東京オフィス 福岡オフィス
![Page 4: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/4.jpg)
4使っているサービス・技術要素
※ほかにもいろいろありますが、主なものを抜粋
![Page 5: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/5.jpg)
5今日お話しする内容
1. 作成したアプリケーション
2. Laravel5について
3. Laravel5を採用した理由
4. 環境構築手順
5. 全体像(リクエストライフサイクル)
6. 開発フローについて
7. 各種開発TIPS
8. 速度改善について
9. まとめ
![Page 6: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/6.jpg)
6作成したアプリケーション
アプリ(Web API) 管理画面
Kinyta という雑誌テイストのコーディネートを楽しむiPhone/Androidアプリ!
![Page 7: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/7.jpg)
7Laravel5について
• PHPでよく知られるMVCフレームワークの1つ。
• MITライセンス。
• 2011/06に初版リリース。Taylor Otwell 氏に
よって開発。
• 2015/02にL5がリリース。PHP5.4以上に対応。
![Page 8: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/8.jpg)
8Laravel5を採用した理由
• 開発効率が上がりそう!
• DIのコンストラクタ/メソッドインジェクションができる!
• アノテーションでルーティングができる!
• デバッガーが便利そう!
• 公式サイトにドキュメントが一通りある!
懸念は…
• 5.0という大きなバージョンアップの直後。4.0からいろいろ変わってる。。
• Laravelは処理が重たいというイメージ。
![Page 9: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/9.jpg)
9DIについて
• DIは、Dependency Injectionの略で「依存性の注入」。
• マーティン・ファウラー氏によって提唱。
• 外部の設定ファイルなどでオブジェクトを定義し、注入することができ
るソフトウェアパターン。
• LaravelではProvidersの実装で登録することによって実現。
• フレームワークコア部分については、拡張できるようApplicationクラス
でContractsというインターフェイスとFacadeという実装プロクシを使っ
て登録。
L5では、コンストラクタ/メソッドを通じてオブジェクトを注入
Auth
Laravel5 /*** お知らせ通知APIコントローラー
* @Middleware("api.key.auth")
*/
class NoticeController extends Controller {
/**
* @return string
*/
public function __construct( )
{
$this->auth = $auth;
}
Auth $auth
![Page 10: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/10.jpg)
10アノテーションについて
プログラムにコメント/タグ付けといったメタ情報を付与することで機能や
属性を持たせる記述方法。
Laravel5では、routingやeventにアノテーションを使用可能。
/*** お知らせ通知APIコントローラー
* @Middleware(“apikey.auth")
*/
class NoticeController extends Controller
{
/*** ユーザーのお知らせ内容を検索して取得する
* @Get("notices")
* @Middleware("user.auth")
* @return string
*/
public function getNoticeSearch()
{
:
}
}
Middleware:
apikey.auth, user.auth
URI:
http://webapi.hogehoge.jp/notices
アノテーションの内容がRoutingに関連付けされる
![Page 11: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/11.jpg)
11Laravel5の環境構築手順
1. composerのインストール
mkdir -p ~/bin
cd ~/bin
curl -sS https://getcomposer.org/installer | php
ln -s composer.phar composer
vi ~/.bash_profile
PATH=$PATH:$HOME/bin:~/.composer/vendor/bin
2. Laravelのインストール
yum -y install git
composer global require "laravel/installer=~1.1"
3. Laravelのアプリを作成
cd /usr/local/apache2laravel new (アプリ名)
chmod 777 -R (アプリ名)/storage
4. 初期設定
cd /usr/local/apache2/(アプリ名)
.env ファイルの編集(※環境に合わせて適宜)
環境構築はコマンドベースでOK
※ZipArchive not foundが表示される場合は、pecl install zipで追加。
![Page 12: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/12.jpg)
12Laravel5推奨パッケージ
"require": {
"laravel/framework": "5.0.*",
"laravelcollective/annotations": "~5.0",
"laravelcollective/html": "~5.0",
"barryvdh/laravel-debugbar": "~2.0"
},
Laravel Collective
Annotations/Form&HTMLLaravel Debugger
composer.jsonの追加例
composer update
ライブラリの環境構築もcomposerで楽々
インストール手順
![Page 13: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/13.jpg)
13Laravel5リクエストライフサイクル
index.php
(1)フロントコントローラー
controller
model
view
appproviders
request
参考 http://laravel.com/docs/master/lifecycle
response
bootstrap(3)リクエスト⇒レスポンス処理
services(4) コンテナに登録し、
サービスを起動
(2)フレームワークを読み込み
middleware
router
(5)リクエストをフィルター+ルーターへ
auth
(6) Controllerを呼び出し
(7)レスポンス処理(テンプレートエンジン等)
HttpKernel
![Page 14: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/14.jpg)
14Laravel5のフォルダ構成
├─app (アプリケーションフォルダ)
│ ├─Bootstrap
│ ├─Commands
│ ├─Console
│ │ └─Commands (バッチ実装)
│ ├─Events
│ ├─Exceptions
│ ├─Handlers
│ │ ├─Commands
│ │ └─Events
│ ├─Http
│ │ ├─Controllers (コントローラー)
│ │ ├─Middleware (フィルター)
│ │ └─Requests (フォーム系リクエスト)
│ ├─Providers (サービスプロバイダー)
│ └─Services
:
:
├─bootstrap
├─config (アプリケーション設定ファイル)
├─database
│ ├─migrations (DBマイグレーション)
│ └─seeds
├─public (ドキュメントルート)
│ └─css
├─resources
│ ├─assets
│ │ └─less
│ │ └─bootstrap
│ │ └─mixins
│ ├─lang
│ │ └─en
│ └─views (テンプレートファイル)
├─setting
├─storage
│ ├─app
│ ├─framework
│ │ ├─cache
│ │ ├─sessions
│ │ └─views
│ └─logs (ログ出力先)
├─tests
└─vendor
appフォルダ直下にデータアクセスオブジェクトを配置するのが、L5の流儀。
![Page 15: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/15.jpg)
15開発フロー
1. Model/Migration追加
2.Controller追加
3. Routing設定
4. View追加
5. 実装
6. テスト
![Page 16: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/16.jpg)
16CLI: artisan
Laravel3よりコマンドラインインターフェイス artisan 追加。
アプリケーションのルートディレクトリでコマンド実行することで開発をサポート。
php artisan make:model (モデル名)
⇒ app/(モデル名).php およびdatabase/migrations以下に
マイグレーションファイルを作成
php artisan migrate:status
⇒ DBマイグレーションの状態チェック
php artisan migrate
⇒ DBマイグレーションの反映
1. Model/Migration追加
アルチザン
![Page 17: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/17.jpg)
17CLI: artisan
php artisan make:controller (コントローラー名)
⇒ app/Http/Controllers 以下にクラスファイルを作成
php artisan route:scan
⇒ルーティングの情報を再読み込みして更新
⇒ storage/framework/route.scanned.phpにキャッシュを生成
2. Controller追加
3. Routing設定
1) コントローラーにルーティングのアノテーションを記述。
2) app/Providers/AnnotationsServiceProvider.phpの$scanRoutesにコントローラクラスパスを追記。
アルチザン
![Page 18: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/18.jpg)
18開発TIPS
1. デバッガーについて
2. ログについて
3. バリデーションについて
4. BLOB型のデータ操作について
5. バッチについて
![Page 19: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/19.jpg)
19開発TIPS:デバッガーについて
デバッガーを有効にすると左下に出てくるLaravelアイコンをクリック
SQLクエリ実行速度
ルーティング情報
アプリケーション実行時間情報
読み込みファイル一覧
接続履歴
パフォーマンスチューニングやデバッグで超使える!
![Page 20: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/20.jpg)
20開発TIPS:ログについて
Log::info(‘ログ内容’);
Log::warn(‘ログ内容’);
Log::debug(‘ログ内容’);
Log::error(‘ログ内容’);
などRFC5424で定義されている7レベルをサポート
/storage/logs/laravel-YYYY-MM-DD.log
に出力
すべて
任意のファイルにログファイルを出力したいときは、同梱されているログライブラリ
Monologを使って独自実装。
public static function writeLog($level, $message)
{
$log = new MonologLogger(MonologLogger::INFO);
$log->pushHandler(
$handler = new RotatingFileHandler(storage_path() . '/logs/'. $level. '.log',
365,
MonologLogger::DEBUG
)
);
$formatter = new LineFormatter("[%datetime%]¥t".$_SERVER['REMOTE_ADDR']."¥t%message%¥t%context%¥t%extra%¥n", null, true, true);
$handler->setFormatter($formatter);
$log->addInfo($message);
}
※config/app.php の ‘log’=>’daily’の場合
![Page 21: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/21.jpg)
21開発TIPS:バリデーション(値検査)について
use ValidatesRequests;
方法1: ValidatesRequestトレイトを差し込んでバリデーション
$this->validate($request, $rules, $messages);
方法2: Validatorファサード(コンテナクラス)を使って明示的にバリデーション
$validator = Validator::make(Input::all(), $rules, $messages);
$validator->setAttributeNames($attributes);
if ($validator->fails()) {
return redirect(‘books/create’)->withErrors($validator)->withInput();
}
// continue processing...
※前のページに戻る処理がValidatesRequestsトレイト内で実装されている。
エラーメッセージや属性(5.1より)を指定することでエラー内容を差し替え可能。
![Page 22: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/22.jpg)
22開発TIPS:BLOB型のデータ操作について
BLOB型は、フレームワークとしてはまだ未サポート。プリペアドステートメントを自分で
作ってbindValue(保存時)/bindColumn(取得時)することで、操作可能。
$conn = $this->getConnection();
$grammar = $conn->getQueryGrammar();
$query = new QueryBuilder($conn, $grammar, $conn->getPostProcessor());
$query->from($this->getTable());
$attributes = $this->getAttributes();
$sql = $grammar->compileInsert($query, $attributes);
$stmt = $conn->getPdo()->prepare($sql);
$id = 1;
foreach ($attributes as $key => $value)
{
if ($key == 'data')
{
$stmt->bindValue($id, fopen($value, 'rb'), PDO::PARAM_LOB);
} else {
$stmt->bindValue($id, $value);
}
$id++;
}
$stmt->execute();
保存時の例:
![Page 23: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/23.jpg)
23開発TIPS:バッチについて
Command追加
artisanでコマンドを追加。artisanからコマンドを実行。
php artisan make:console (コマンドクラス名) –-command=(コマンド名)
app/Console/Commands/(コマンドクラス名).phpを追加。
app/Console/Kernel.phpの$commandsプロパティにクラスパスを追加す
ることでartisanから(コマンド名)を実行可能。
Command実行
php artisan (コマンド名)
⇒コマンドクラスのfireメソッドの内容が実行されます。
![Page 24: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/24.jpg)
24Laravel5の速度改善について
1. opcacheの有効化
2. フレームワークキャッシュの適用
3. アプリケーションキャッシュの組み込み
※他にHHVM(HipHopVM)も速度改善の候補してあるが、CentoOS環境
だったこともあり、今回は未調査。
オペキャッシュ
![Page 25: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/25.jpg)
25速度改善(1):opcacheについて
114.77ms
34.51ms
レスポンスは、2~3倍程度早くなる。
適用前
適用後
オペキャッシュ
![Page 26: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/26.jpg)
26速度改善(1):opcacheについて
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=5000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
opcache.validate_timestamps=1
opcache.revalidate_freq=60
60秒ごとにスクリプトのタイムスタンプをチェックし、キャッシュを更新
php.ini設定例:
オペキャッシュ
![Page 27: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/27.jpg)
27速度改善(2):フレームワークキャッシュの適用
php artisan config:cache
設定ファイルのマージ。
vendor/config.php(権限がない場合はstorage/framework/config.php)を作成。
php artisan config:clearでクリア。
php artisan optimize
コアクラスのファイルをまとめる。
vendor/compiled.php(権限がない場合はstorage/framework/compiled.php)を作成。
bootstrap/autoload.phpから読み込んでいる。
php artisan clear-compiledでクリア。
![Page 28: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/28.jpg)
28速度改善(3):アプリケーションキャッシュの組み込み
$top = Cache::remember('recentTop', Config::get('cache.span'), function () {
return Top::findRecent();
});
$top = Top::findRecent();
‘recentTop’というキーのキャッシュがなければ、クロージャの中身を実行。
その内容をCongif::get(‘cache.span’)分間キャッシュで保持。
簡単に既存実装のキャッシュ化ができる。
例:TopモデルからfindRecentというメソッドでデータを取得。
Cacheクラスを適用する場合…
![Page 29: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/29.jpg)
29まとめ
Laravel5の開発は楽しい!
DI
Trait
アノテーション
フルスタックなフレームワーク。
composerにより外部の機能も取り込みやすい。
そのままでは遅い!…でも、opcacheやキャッシュ
など組み合わせれば、使える、と思う!
![Page 30: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/30.jpg)
30補足: Laracast
Laravel学習&コミュニティサイト
![Page 31: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/31.jpg)
31補足: Laravel求人サイト
Laravel求人サイト
![Page 32: Laravel5を使って開発してみた](https://reader031.vdocuments.pub/reader031/viewer/2022020218/55c67c9fbb61eb5a578b4682/html5/thumbnails/32.jpg)
32補足: 開発環境(laravel/homestead)
vagrant box add laravel/homestead
git clone https://github.com/laravel/homestead.git Homestead
bash init.sh
Vagrantを使った開発環境も提供
• Ubuntu 14.04
• PHP 5.6
• HHVM
• Nginx
• MySQL
• Postgres
• Node (With Bower, Grunt, and Gulp)
• Redis
• Memcached
• Beanstalkd
• Laravel Envoy
• Blackfire Profiler参考 http://laravel.com/docs/5.0/homestead