Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Laravel5を使って開発してみた
Search
Takeo Noda
June 27, 2015
Programming
0
240
Laravel5を使って開発してみた
Laravel5を使って開発した話を紹介します。開発導入の参考になれば幸いです。
Takeo Noda
June 27, 2015
Tweet
Share
More Decks by Takeo Noda
See All by Takeo Noda
システム開発におけるディレクションのすゝめ / the way to direction
nodat
1
1.5k
Laravelの認証について / Let's talk about Laravel
nodat
2
450
Zabbixで学ぶ統計解析入門
nodat
1
1.5k
Laravelとテストについて
nodat
1
1.1k
Other Decks in Programming
See All in Programming
Vue SFCのtemplateでTypeScriptの型を活用しよう
tsukkee
3
1.5k
Googleのテストサイズを活用したテスト環境の構築
toms74209200
0
270
ピラミッド、アイスクリームコーン、SMURF: 自動テストの最適バランスを求めて / Pyramid Ice-Cream-Cone and SMURF
twada
PRO
9
980
Vitest Browser Mode への期待 / Vitest Browser Mode
odanado
PRO
2
1.7k
AWS IaCの注目アップデート 2024年10月版
konokenj
3
3.1k
Go言語でターミナルフレンドリーなAIコマンド、afaを作った/fukuokago20_afa
monochromegane
2
140
[PyCon Korea 2024 Keynote] 커뮤니티와 파이썬, 그리고 우리
beomi
0
110
Kotlin2でdataクラスの copyメソッドを禁止する/Data class copy function to have the same visibility as constructor
eichisanden
1
120
役立つログに取り組もう
irof
26
8.6k
CSC509 Lecture 08
javiergs
PRO
0
100
VR HMDとしてのVision Pro+ゲーム開発について
yasei_no_otoko
0
100
2万ページのSSG運用における工夫と注意点 / Vue Fes Japan 2024
chinen
3
1.3k
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
95
5.2k
GraphQLの誤解/rethinking-graphql
sonatard
66
9.9k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.2k
The Language of Interfaces
destraynor
154
24k
Testing 201, or: Great Expectations
jmmastey
38
7k
Navigating Team Friction
lara
183
14k
Designing for humans not robots
tammielis
249
25k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
25
1.8k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
355
29k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
3
370
Transcript
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アプリ!
7 Laravel5について • PHPでよく知られるMVCフレームワークの1つ。 • MITライセンス。 • 2011/06に初版リリース。Taylor Otwell 氏に
よって開発。 • 2015/02にL5がリリース。PHP5.4以上に対応。
8 Laravel5を採用した理由 • 開発効率が上がりそう! • DIのコンストラクタ/メソッドインジェクションができる! • アノテーションでルーティングができる! • デバッガーが便利そう!
• 公式サイトにドキュメントが一通りある! 懸念は… • 5.0という大きなバージョンアップの直後。4.0からいろいろ変わってる。。 • Laravelは処理が重たいというイメージ。
9 DIについて • 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に関連付けされる
11 Laravel5の環境構築手順 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で追加。
12 Laravel5推奨パッケージ "require": { "laravel/framework": "5.0.*", "laravelcollective/annotations": "~5.0", "laravelcollective/html": "~5.0",
"barryvdh/laravel-debugbar": "~2.0" }, Laravel Collective Annotations/Form&HTML Laravel Debugger composer.jsonの追加例 composer update ライブラリの環境構築も composerで楽々 インストール手順
13 Laravel5リクエストライフサイクル 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
14 Laravel5のフォルダ構成 ├─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の流儀。
15 開発フロー 1. Model/Migration 追加 2.Controller追加 3. Routing設定 4. View追加
5. 実装 6. テスト
16 CLI: artisan Laravel3よりコマンドラインインターフェイス artisan 追加。 アプリケーションのルートディレクトリでコマンド実行することで開発をサポート。 php artisan make:model
(モデル名) ⇒ app/(モデル名).php およびdatabase/migrations以下に マイグレーションファイルを作成 php artisan migrate:status ⇒ DBマイグレーションの状態チェック php artisan migrate ⇒ DBマイグレーションの反映 1. Model/Migration追加 アルチザン
17 CLI: 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::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’の場合
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メソッドの内容が実行されます。
24 Laravel5の速度改善について 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