laravel5を使って開発してみた

32
Laravel5を使って開発してみた 2015/06/27 株式会社セブンメディア 野田健夫

Upload: takeo-noda

Post on 09-Aug-2015

589 views

Category:

Software


6 download

TRANSCRIPT

Page 1: Laravel5を使って開発してみた

Laravel5を使って開発してみた

2015/06/27

株式会社セブンメディア 野田健夫

Page 2: Laravel5を使って開発してみた

2こんにちは!

野田健夫(のだたけお)https://twitter.com/nodatakeo

https://www.facebook.com/nodatakeo

株式会社セブンメディア チーフアーキテクト

Page 3: Laravel5を使って開発してみた

3会社について

■社名 株式会社セブンメディア(英語表記: Sevenmedia,Inc.)

■所在地 〒108-0073 東京都港区三田3-9-7 三田三好ビル5F

■設立 2011年9月

■代表取締役 田村 順一

東京オフィス 福岡オフィス

Page 4: Laravel5を使って開発してみた

4使っているサービス・技術要素

※ほかにもいろいろありますが、主なものを抜粋

Page 5: Laravel5を使って開発してみた

5今日お話しする内容

1. 作成したアプリケーション

2. Laravel5について

3. Laravel5を採用した理由

4. 環境構築手順

5. 全体像(リクエストライフサイクル)

6. 開発フローについて

7. 各種開発TIPS

8. 速度改善について

9. まとめ

Page 6: Laravel5を使って開発してみた

6作成したアプリケーション

アプリ(Web API) 管理画面

Kinyta という雑誌テイストのコーディネートを楽しむiPhone/Androidアプリ!

Page 7: Laravel5を使って開発してみた

7Laravel5について

• PHPでよく知られるMVCフレームワークの1つ。

• MITライセンス。

• 2011/06に初版リリース。Taylor Otwell 氏に

よって開発。

• 2015/02にL5がリリース。PHP5.4以上に対応。

Page 8: Laravel5を使って開発してみた

8Laravel5を採用した理由

• 開発効率が上がりそう!

• DIのコンストラクタ/メソッドインジェクションができる!

• アノテーションでルーティングができる!

• デバッガーが便利そう!

• 公式サイトにドキュメントが一通りある!

懸念は…

• 5.0という大きなバージョンアップの直後。4.0からいろいろ変わってる。。

• Laravelは処理が重たいというイメージ。

Page 9: Laravel5を使って開発してみた

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を使って開発してみた

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を使って開発してみた

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を使って開発してみた

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を使って開発してみた

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を使って開発してみた

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を使って開発してみた

15開発フロー

1. Model/Migration追加

2.Controller追加

3. Routing設定

4. View追加

5. 実装

6. テスト

Page 16: Laravel5を使って開発してみた

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を使って開発してみた

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を使って開発してみた

18開発TIPS

1. デバッガーについて

2. ログについて

3. バリデーションについて

4. BLOB型のデータ操作について

5. バッチについて

Page 19: Laravel5を使って開発してみた

19開発TIPS:デバッガーについて

デバッガーを有効にすると左下に出てくるLaravelアイコンをクリック

SQLクエリ実行速度

ルーティング情報

アプリケーション実行時間情報

読み込みファイル一覧

接続履歴

パフォーマンスチューニングやデバッグで超使える!

Page 20: Laravel5を使って開発してみた

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を使って開発してみた

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を使って開発してみた

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を使って開発してみた

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を使って開発してみた

24Laravel5の速度改善について

1. opcacheの有効化

2. フレームワークキャッシュの適用

3. アプリケーションキャッシュの組み込み

※他にHHVM(HipHopVM)も速度改善の候補してあるが、CentoOS環境

だったこともあり、今回は未調査。

オペキャッシュ

Page 25: Laravel5を使って開発してみた

25速度改善(1):opcacheについて

114.77ms

34.51ms

レスポンスは、2~3倍程度早くなる。

適用前

適用後

オペキャッシュ

Page 26: Laravel5を使って開発してみた

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を使って開発してみた

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を使って開発してみた

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を使って開発してみた

29まとめ

Laravel5の開発は楽しい!

DI

Trait

アノテーション

フルスタックなフレームワーク。

composerにより外部の機能も取り込みやすい。

そのままでは遅い!…でも、opcacheやキャッシュ

など組み合わせれば、使える、と思う!

Page 30: Laravel5を使って開発してみた

30補足: Laracast

Laravel学習&コミュニティサイト

Page 31: Laravel5を使って開発してみた

31補足: Laravel求人サイト

Laravel求人サイト

Page 32: Laravel5を使って開発してみた

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