SlideShare a Scribd company logo
Laravel5を使って開発してみた
2015/06/27
株式会社セブンメディア 野田健夫
2こんにちは!
野田健夫(のだたけお)
https://twitter.com/nodatakeo
https://www.facebook.com/nodatakeo
株式会社セブンメディア チーフアーキテクト
3会社について
■社名 株式会社セブンメディア(英語表記: Sevenmedia,Inc.)
■所在地 〒108-0073 東京都港区三田3-9-7 三田三好ビル5F
■設立 2011年9月
■代表取締役 田村 順一
東京オフィス 福岡オフィス
4使っているサービス・技術要素
※ほかにもいろいろありますが、主なものを抜粋
5今日お話しする内容
1. 作成したアプリケーション
2. Laravel5について
3. Laravel5を採用した理由
4. 環境構築手順
5. 全体像(リクエストライフサイクル)
6. 開発フローについて
7. 各種開発TIPS
8. 速度改善について
9. まとめ
6作成したアプリケーション
アプリ(Web API) 管理画面
Kinyta という雑誌テイストのコーディネートを楽しむiPhone/Androidアプリ!
7Laravel5について
• PHPでよく知られるMVCフレームワークの1つ。
• MITライセンス。
• 2011/06に初版リリース。Taylor Otwell 氏に
よって開発。
• 2015/02にL5がリリース。
• 2015/06にLTS(LongTermSupport)のL5.1がリ
リース。PHP5.5.9以上に対応。
8Laravel5を採用した理由
• 開発効率が上がりそう!
• DIのコンストラクタ/メソッドインジェクションができる!
• アノテーションでルーティングができる!
• デバッガーが便利そう!
• 公式サイトにドキュメントが一通りある!
懸念は…
• 5.0という大きなバージョンアップの直後。4.0からいろいろ変わってる。。
• Laravelは処理が重たいというイメージ。
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
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に関連付けされる
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/apache2
laravel new (アプリ名)
chmod 777 -R (アプリ名)/storage
4. 初期設定
cd /usr/local/apache2/(アプリ名)
.env ファイルの編集(※環境に合わせて適宜)
環境構築はコマンドベースでOK
※ZipArchive not foundが表示される場合は、pecl install zipで追加。
12Laravel5推奨パッケージ
"require": {
"laravel/framework": "v5.1.6“,
"laravelcollective/annotations": "~5.1”,
“laravelcollective/html”: “~5.1",
"barryvdh/laravel-debugbar": "~2.0"
},
Laravel Collective
Annotations/Form&HTML
Laravel Debugger
composer.jsonの追加例
composer update
ライブラリの環境構築も
composerで楽々
インストール手順
13Laravel5リクエストライフサイクル
index.php
(1)フロントコントローラー
controller
model
view
app
providers
request
参考 http://laravel.com/docs/master/lifecycle
response
bootstrap
(3)リクエスト⇒レスポンス処理
services
(4) コンテナに登録し、
サービスを起動
(2)フレームワークを読み込み
middleware
router
(5)リクエストをフィルター+ルーターへ
auth
(6) Controllerを呼び出し
(7)レスポンス処理(テンプレートエンジン等)
HttpKernel
14Laravel5のフォルダ構成
├─app (アプリケーションフォルダ)
│ ├─Bootstrap
│ ├─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の流儀。
15開発フロー
1. Model/Migration
追加
2.Controller追加
3. Routing設定
4. View追加
5. 実装
6. テスト
16CLI: artisan
Laravel3よりコマンドラインインターフェイス artisan 追加。
アプリケーションのルートディレクトリでコマンド実行することで開発をサポート。
php artisan make:model (モデル名)
⇒ app/(モデル名).php およびdatabase/migrations以下に
マイグレーションファイルを作成
php artisan migrate:status
⇒ DBマイグレーションの状態チェック
php artisan migrate
⇒ DBマイグレーションの反映
1. Model/Migration追加
アルチザン
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にコントローラクラスパスを追記。
アルチザン
18開発TIPS
1. デバッガーについて
2. ログについて
3. バリデーションについて
4. BLOB型のデータ操作について
5. バッチについて
19開発TIPS:デバッガーについて
デバッガーを有効にすると左下に出てくるLaravelアイコンをクリック
SQLクエリ実行速度
ルーティング情報
アプリケーション実行時間情報
読み込みファイル一覧
接続履歴
パフォーマンスチューニングやデバッグで超使える!
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::INFO
)
);
$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’の場合
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トレイト内で実装されている。
日本語に対応させるためにはこれをベースに拡張することで可能。
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();
保存時の例:
23開発TIPS:バッチについて
Command追加
artisanでコマンドを追加。artisanからコマンドを実行。
php artisan make:console (コマンドクラス名) –-command=(コマンド名)
 app/Console/Commands/(コマンドクラス名).phpを追加。
 app/Console/Kernel.phpの$commandsプロパティにクラスパスを追加す
ることでartisanから(コマンド名)を実行可能。
Command実行
php artisan (コマンド名)
⇒ コマンドクラスのfireメソッドの内容が実行されます。
24Laravel5の速度改善について
1. opcacheの有効化
2. フレームワークキャッシュの適用
3. アプリケーションキャッシュの組み込み
※他にHHVM(HipHopVM)も速度改善の候補してあるが、CentoOS環境
だったこともあり、今回は未調査。
オペキャッシュ
25速度改善(1):opcacheについて
114.77ms
34.51ms
レスポンスは、2~3倍程度早くなる。
適用前
適用後
オペキャッシュ
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設定例:
オペキャッシュ
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でクリア。
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クラスを適用する場合…
29まとめ
 Laravel5の開発は楽しい!
 DI
 Trait
 アノテーション
 フルスタックなフレームワーク。
 composerにより外部の機能も取り込みやすい。
 そのままでは遅い!…でも、opcacheやキャッシュ
など組み合わせれば、使える、と思う!
30補足: Laracast
Laravel学習&コミュニティサイト
31補足: Laravel求人サイト
Laravel求人サイト
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

More Related Content

PDF
thymeleafさいしょの一歩
PDF
DDD 구현기초 (거의 Final 버전)
ODP
GNU AGPLv3について(On GNU AGPLv3)
PDF
Scala の関数型プログラミングを支える技術
PDF
たのしい関数型
PDF
CloudNativeな決済サービスの開発と2年間の歩み #sf_A4
PDF
Hadoop/Spark を使うなら Bigtop を使い熟そう! ~並列分散処理基盤のいま、から Bigtop の最近の取り組みまで一挙ご紹介~(Ope...
PDF
DevOpsに求められる様々な技術とその連携の学習方法
thymeleafさいしょの一歩
DDD 구현기초 (거의 Final 버전)
GNU AGPLv3について(On GNU AGPLv3)
Scala の関数型プログラミングを支える技術
たのしい関数型
CloudNativeな決済サービスの開発と2年間の歩み #sf_A4
Hadoop/Spark を使うなら Bigtop を使い熟そう! ~並列分散処理基盤のいま、から Bigtop の最近の取り組みまで一挙ご紹介~(Ope...
DevOpsに求められる様々な技術とその連携の学習方法

What's hot (20)

PDF
O/Rマッパーによるトラブルを未然に防ぐ
PPTX
Spanner移行について本気出して考えてみた
PDF
webservice scaling for newbie
PDF
Windows コンテナを AKS に追加する
PPTX
大規模CSVをMySQLに入れる
PDF
AnyObject – 自分が見落としていた、基本の話
PDF
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
PPTX
大規模分散システムの現在 -- GFS, MapReduce, BigTableはどう変化したか?
PPTX
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
PDF
2018 builderscon airflowを用いて、 複雑大規模なジョブフロー管理 に立ち向かう
PDF
SignalRブートキャンプ
PDF
ブレソルでテラバイト級データのALTERを短時間で終わらせる
PPTX
NDC2017 언리얼 엔진4 애니메이션 공유 캐릭터 설계
PDF
Serf / Consul 入門 ~仕事を楽しくしよう~
PDF
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
PDF
社内のマニュアルをSphinxで作ってみた
PPTX
Spring と TDD
PDF
KafkaとAWS Kinesisの比較
PDF
ソーシャルゲーム案件におけるDB分割のPHP実装
PDF
インフラチームのリモートワーク
O/Rマッパーによるトラブルを未然に防ぐ
Spanner移行について本気出して考えてみた
webservice scaling for newbie
Windows コンテナを AKS に追加する
大規模CSVをMySQLに入れる
AnyObject – 自分が見落としていた、基本の話
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
大規模分散システムの現在 -- GFS, MapReduce, BigTableはどう変化したか?
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
2018 builderscon airflowを用いて、 複雑大規模なジョブフロー管理 に立ち向かう
SignalRブートキャンプ
ブレソルでテラバイト級データのALTERを短時間で終わらせる
NDC2017 언리얼 엔진4 애니메이션 공유 캐릭터 설계
Serf / Consul 入門 ~仕事を楽しくしよう~
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
社内のマニュアルをSphinxで作ってみた
Spring と TDD
KafkaとAWS Kinesisの比較
ソーシャルゲーム案件におけるDB分割のPHP実装
インフラチームのリモートワーク
Ad

Similar to Laravel5を使って開発してみた (20)

PPTX
Laravelで作成したアプリ紹介
PPTX
Lumen使ってみたレポ
PPTX
Laravel本とコミュニティの話
PDF
今、最もイケてるPHPフレームワークLaravel4
PDF
Creators meetup5
PDF
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
PDF
Laravel 5.1 LTSでサービスを作る
PPT
今、最もイケてるPHPフレームワークLaravel4
PDF
Laravel4で運用するサービス,そしてlaravel5へ
PDF
Laravelから学びレガシーと闘いはじめた
PDF
Laravel × レイヤードアーキテクチャをやってみている話
PDF
「新しい」を生み出すためのWebアプリ開発とその周辺
PDF
WTM53 phpフレームワーク いまさらcodeigniter
PDF
10分でわかるFuelPHP @ 2011/12
PPTX
活動報告9 laravel5入門-
PDF
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
PDF
第104回 php勉強会@東京 Laravel
PDF
Software Development with Symfony
PPTX
Tech fun rails_workshop
PPTX
<第1回>Laravelハンズオンセミナー
Laravelで作成したアプリ紹介
Lumen使ってみたレポ
Laravel本とコミュニティの話
今、最もイケてるPHPフレームワークLaravel4
Creators meetup5
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
Laravel 5.1 LTSでサービスを作る
今、最もイケてるPHPフレームワークLaravel4
Laravel4で運用するサービス,そしてlaravel5へ
Laravelから学びレガシーと闘いはじめた
Laravel × レイヤードアーキテクチャをやってみている話
「新しい」を生み出すためのWebアプリ開発とその周辺
WTM53 phpフレームワーク いまさらcodeigniter
10分でわかるFuelPHP @ 2011/12
活動報告9 laravel5入門-
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
第104回 php勉強会@東京 Laravel
Software Development with Symfony
Tech fun rails_workshop
<第1回>Laravelハンズオンセミナー
Ad

More from Takeo Noda (12)

PDF
スタートアップにやさしいAWS
PDF
Vue入門
PDF
Prometeusについてはじめてみよう / Let's start Prometeus
PDF
ディレクションのすゝめ
PDF
負荷テスト入門
PPTX
データ解析入門
PDF
Laravelの認証について
PDF
Zabbixで学ぶ統計解析入門
PDF
Laravelとテストについて
PDF
Zabbix入門
PDF
映像・音響機材入門
PDF
サイト運用者に向けたバージョン管理について
スタートアップにやさしいAWS
Vue入門
Prometeusについてはじめてみよう / Let's start Prometeus
ディレクションのすゝめ
負荷テスト入門
データ解析入門
Laravelの認証について
Zabbixで学ぶ統計解析入門
Laravelとテストについて
Zabbix入門
映像・音響機材入門
サイト運用者に向けたバージョン管理について

Laravel5を使って開発してみた