Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Laravel本とコミュニティの話

569 views

Published on

2018-11-28 ららびゅう座談会でご紹介したスライドです。

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Laravel本とコミュニティの話

  1. 1. 裏話的な • スケジュール • 幻のパフォーマンスチューニング • エモい話 Laravel本と コミュニティの話 ららびゅう座談会vol.1 2018-11-28 @kurikazu
  2. 2. @kurikazu • 栗生 和明 • ディップ株式会社 • 求人広告メディアの Web, アプリのPM • エンジニアチームの 組織改善 • エンジニア採用
  3. 3. • 社内プロダクトでの 開発支援 • Laravel答えるタイム • Laravel Meetup Tokyo スタッフ • Laravel JP Conference スタッフ rel Laravel
  4. 4. 今日の話 • 普段の Laravel の使いどころ • Laravel JP Conference • Laravel Meetup Tokyo • 本の話
  5. 5. 普段のLaravelの利用について
  6. 6. 普段のLaravelの利用について • 採用担当者向けサイト & バッチ • 関連サービス(採用業務支援ツール) • 社内向け業務ツール etc…
  7. 7. 主な機能 • 求人情報編集 • 採用担当者管理 • 応募者管理 • 企業ごとの契約情報管理 • データレプリケーション • 各種メール配信 • 提携サイトへのデータ配信・ アップロード • その他、システムへのデータ連係
  8. 8. 詳しいお話は座談会にて…
  9. 9. Laravel JP Conference 2019年2月16日(土) 田町グランパークカンファレンス
  10. 10. Laravel JP Conference • LaravelやLumen、その周辺技術を 題材にしたセッション、実例などのトーク • PHPやその周辺技術、設計などのセッション、トーク • ワークショップ • その他企画を検討中
  11. 11. Laravel JP Conference トーク募集中! (30分&5分)
  12. 12. Laravel JP Conference • FacadeもEloquentもバリバリ使って 開発してる • こんなパッケージ使ってる、カスタマイズしてる • こんなことしようとしたら嵌った • こんな設計で作ってる
  13. 13. 多くの人が使っている今だからこそ あなたの話が聞きたい。
  14. 14. Laravel JP Conference 締切は11/30!!!
  15. 15. Laravel JP Conference ご応募お待ちしています! https://conference2019.laravel.jp/
  16. 16. Laravel Meetup Tokyo について
  17. 17. Laravel Meetup Tokyo • 2013-05-23 #1 開催 • 現在#11 まで実施 • #3 初参加 • #4 トーク&開催お手伝い • #8 メインスタッフ
  18. 18. • これまでやってきたこと • Laravel Testing Decoded (JP) 読書会 • もくもく会 • Laravel vs Yii • Freek さんのトーク (@freekmurze) • 最近は20分トーク+LT Laravel Meetup Tokyo
  19. 19. Laravel Meetup Tokyo • 参加者たくさん(ありがとうございます) • 現場での導入事例を聞ける場 (最近は設計話が増えてきた気がする) [主催者として] • 様々な知見を得る • 学ぶ&アウトプットの 「場所」をつくる
  20. 20. 裏話的な • スケジュール • 幻のパフォーマンスチューニング • エモい話 Laravel本について
  21. 21. 裏話的な • スケジュール • 幻のパフォーマンスチューニング • エモい話 Overview PHPフレームワーク Laravel Webアプリケーション開発 バージョン 5.5 LTS対応 • 竹澤さん、新原さん、大村さんとの共著 • 2018年9月26日発売、544ページ • 出版:ソシム社 ※ ソシム社のページにGitHubのURLと 正誤表があります。ご参照ください。
  22. 22. 裏話的な • スケジュール • 幻のパフォーマンスチューニング • エモい話 こぼれ話・・・の前に せっかくなので
  23. 23. 裏話的な • スケジュール • 幻のパフォーマンスチューニング • エモい話 Laravelのライフサイクル (2-1章)について コードを潜ってみましょう
  24. 24. View public/index.php [オートローダー読込] public/index.php [フレームワーク起動] bootstrap/app.php GlobalMiddleware実行(前処理) [アプリケーション初期処理] Kernelクラス初期化 RouteMiddleware実行(前処理) RDB RouteMiddleware実行(後処理) GlobalMiddleware実行(後処理) Request Response Model Controller ※MVCパターンの場合 ルータ ルータ ※査読前の図をつかいます
  25. 25. View public/index.php [オートローダー読込] public/index.php [フレームワーク起動] bootstrap/app.php GlobalMiddleware実行(前処理) [アプリケーション初期処理] Kernelクラス初期化 RouteMiddleware実行(前処理) RDB RouteMiddleware実行(後処理) GlobalMiddleware実行(後処理) Request Response Model Controller ※MVCパターンの場合 ルータ ルータ
  26. 26. View public/index.php [オートローダー読込] public/index.php [フレームワーク起動] bootstrap/app.php GlobalMiddleware実行(前処理) [アプリケーション初期処理] Kernelクラス初期化 RouteMiddleware実行(前処理) RDB RouteMiddleware実行(後処理) GlobalMiddleware実行(後処理) Request Response Model Controller ※MVCパターンの場合 ルータ ルータ View public/index.php GlobalMiddleware実行(前処理) Router RouteMiddleware実行(前処理) RDBMS RouteMiddleware実行(後処理) GlobalMiddleware実行(後処理) Request Response Model Controller オートローダ • Laravelで使うPHPファイ ルを include や require でいちいち読み込まなく ても利用できるようにす る設定 • 設定ファイルは composerが生成 ⇒ FileNotFound は composer update で解決するかも
  27. 27. View public/index.php [オートローダー読込] public/index.php [フレームワーク起動] bootstrap/app.php GlobalMiddleware実行(前処理) [アプリケーション初期処理] Kernelクラス初期化 RouteMiddleware実行(前処理) RDB RouteMiddleware実行(後処理) GlobalMiddleware実行(後処理) Request Response Model Controller ※MVCパターンの場合 ルータ ルータ
  28. 28. View public/index.php [オートローダー読込] public/index.php [フレームワーク起動] bootstrap/app.php GlobalMiddleware実行(前処理) [アプリケーション初期処理] Kernelクラス初期化 RouteMiddleware実行(前処理) RDB RouteMiddleware実行(後処理) GlobalMiddleware実行(後処理) Request Response Model Controller ※MVCパターンの場合 ルータ ルータ フレームワーク 起動 • Applicationクラス=サー ビスコンテナのインスタ ンスを生成 • 上記インスタンスに Kernelクラスと Exceptionクラスを バインド • 上記インスタンスを返却
  29. 29. <?php define('LARAVEL_START', microtime(true)); require __DIR__.'/../vendor/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php'; $kernel = $app->make(Illuminate¥Contracts¥Http¥Kernel::class); $response = $kernel->handle( $request = Illuminate¥Http¥Request::capture() ); $response->send(); $kernel->terminate($request, $response); public/index.php
  30. 30. bootstrap/app.php <?php // Applicationクラス(サービスコンテナ)インスタンスの取得 $app = new Illuminate¥Foundation¥Application( realpath(__DIR__.'/../') ); // Kernelなどのクラスをシングルトン指定でバインド $app->singleton( Illuminate¥Contracts¥Http¥Kernel::class, App¥Http¥Kernel::class ); $app->singleton( Illuminate¥Contracts¥Console¥Kernel::class, App¥Console¥Kernel::class ); $app->singleton( Illuminate¥Contracts¥Debug¥ExceptionHandler::class, App¥Exceptions¥Handler::class ); return $app;
  31. 31. View public/index.php [オートローダー読込] public/index.php [フレームワーク起動] bootstrap/app.php GlobalMiddleware実行(前処理) [アプリケーション初期処理] Kernelクラス初期化 RouteMiddleware実行(前処理) RDB RouteMiddleware実行(後処理) GlobalMiddleware実行(後処理) Request Response Model Controller ※MVCパターンの場合 ルータ ルータ
  32. 32. View public/index.php [オートローダー読込] public/index.php [フレームワーク起動] bootstrap/app.php GlobalMiddleware実行(前処理) [アプリケーション初期処理] Kernelクラス初期化 RouteMiddleware実行(前処理) RDB RouteMiddleware実行(後処理) GlobalMiddleware実行(後処理) Request Response Model Controller ※MVCパターンの場合 ルータ ルータ カーネルクラス 初期化 • Kernelクラスの初期化 (ミドルウェアリストの 読み込み)
  33. 33. <?php define('LARAVEL_START', microtime(true)); require __DIR__.'/../vendor/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php'; $kernel = $app->make(Illuminate¥Contracts¥Http¥Kernel::class); $response = $kernel->handle( $request = Illuminate¥Http¥Request::capture() ); $response->send(); $kernel->terminate($request, $response); public/index.php
  34. 34. AppHttpKernel <?php namespace App¥Http; use Illuminate¥Foundation¥Http¥Kernel as HttpKernel; class Kernel extends HttpKernel { protected $middleware = [ // (略) protected $middlewareGroups = [ // (略) 'web' => [ // (略) 'api' => [ // (略) ]; protected $routeMiddleware = [ // (略) } ミドルウェアを定義する コンストラクタメソッドは こっちにある
  35. 35. Illuminate¥Foundation¥Http¥Kernel public function __construct(Application $app, Router $router) { $this->app = $app; $this->router = $router; $router->middlewarePriority = $this->middlewarePriority; foreach ($this->middlewareGroups as $key => $middleware) { $router->middlewareGroup($key, $middleware); } foreach ($this->routeMiddleware as $key => $middleware) { $router->aliasMiddleware($key, $middleware); } } Middleware定義を ルータに登録 Middleware定義を ルータに登録 Middleware定義を ルータに登録
  36. 36. View public/index.php [オートローダー読込] public/index.php [フレームワーク起動] bootstrap/app.php GlobalMiddleware実行(前処理) [アプリケーション初期処理] Kernelクラス初期化 RouteMiddleware実行(前処理) RDB RouteMiddleware実行(後処理) GlobalMiddleware実行(後処理) Request Response Model Controller ※MVCパターンの場合 ルータ ルータ
  37. 37. View public/index.php [オートローダー読込] public/index.php [フレームワーク起動] bootstrap/app.php GlobalMiddleware実行(前処理) [アプリケーション初期処理] Kernelクラス初期化 RouteMiddleware実行(前処理) RDB RouteMiddleware実行(後処理) GlobalMiddleware実行(後処理) Request Response Model Controller ※MVCパターンの場合 ルータ ルータ ・動作環境の読込 ・Configファイル読込 ・エラーハンドラの読込 ・Facade定義の読込 ・ServiceProviderの読込 および登録 (サービスコンテナへのバ インド) アプリケーション 初期処理
  38. 38. <?php define('LARAVEL_START', microtime(true)); require __DIR__.'/../vendor/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php'; $kernel = $app->make(Illuminate¥Contracts¥Http¥Kernel::class); $response = $kernel->handle( $request = Illuminate¥Http¥Request::capture() ); $response->send(); $kernel->terminate($request, $response); public/index.php
  39. 39. Illuminate¥Foundation¥Http¥Kernel public function handle($request) { try { $request->enableHttpMethodParameterOverride(); $response = $this->sendRequestThroughRouter($request); } catch (Exception $e) { $this->reportException($e); $response = $this->renderException($request, $e); } catch (Throwable $e) { $this->reportException($e = new FatalThrowableError($e)); $response = $this->renderException($request, $e); } $this->app['events']->dispatch( new Events¥RequestHandled($request, $response) ); return $response; }
  40. 40. protected function sendRequestThroughRouter($request) { $this->app->instance('request', $request); Facade::clearResolvedInstance('request'); // この中で前述の初期処理たちを実行 $this->bootstrap(); return (new Pipeline($this->app)) ->send($request) ->through($this->app->shouldSkipMiddleware() ? [] : $this- >middleware) ->then($this->dispatchToRouter()); } Illuminate¥Foundation¥Http¥Kernel
  41. 41. View public/index.php [オートローダー読込] public/index.php [フレームワーク起動] bootstrap/app.php GlobalMiddleware実行(前処理) [アプリケーション初期処理] Kernelクラス初期化 RouteMiddleware実行(前処理) RDB RouteMiddleware実行(後処理) GlobalMiddleware実行(後処理) Request Response Model Controller ※MVCパターンの場合 ルータ ルータ
  42. 42. View public/index.php [オートローダー読込] public/index.php [フレームワーク起動] bootstrap/app.php GlobalMiddleware実行(前処理) [アプリケーション初期処理] Kernelクラス初期化 RouteMiddleware実行(前処理) RDB RouteMiddleware実行(後処理) GlobalMiddleware実行(後処理) Request Response Model Controller ※MVCパターンの場合 ルータ ルータ ルータ 〜 ミドルウェア 〜 コントローラ • ミドルウェア[前処理] • グローバル • Web, APIグループ • ルート • コントローラ • ミドルウェア[後処理] • レスポンスを返却
  43. 43. Symfony¥Component¥HttpFoundation¥Request public static function createFromGlobals() { $server = $_SERVER; if ('cli-server' === PHP_SAPI) { if (array_key_exists('HTTP_CONTENT_LENGTH', $_SERVER)) { $server['CONTENT_LENGTH'] = $_SERVER['HTTP_CONTENT_LENGTH']; } if (array_key_exists('HTTP_CONTENT_TYPE', $_SERVER)) { $server['CONTENT_TYPE'] = $_SERVER['HTTP_CONTENT_TYPE']; } } // GETやPOST以外にも、cookieやserver変数も含めて$requestクラスに格納される $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $server); if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded') && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH')) ) { parse_str($request->getContent(), $data); $request->request = new ParameterBag($data); } return $request; } Symfonyから Requestクラスを生成
  44. 44. protected function sendRequestThroughRouter($request) { $this->app->instance('request', $request); Facade::clearResolvedInstance('request'); $this->bootstrap(); // ルータ以降の処理を実行 return (new Pipeline($this->app)) ->send($request) ->through($this->app->shouldSkipMiddleware() ? [] : $this- >middleware) ->then($this->dispatchToRouter()); } Illuminate¥Foundation¥Http¥Kernel
  45. 45. View public/index.php [オートローダー読込] public/index.php [フレームワーク起動] bootstrap/app.php GlobalMiddleware実行(前処理) [アプリケーション初期処理] Kernelクラス初期化 RouteMiddleware実行(前処理) RDB RouteMiddleware実行(後処理) GlobalMiddleware実行(後処理) Request Response Model Controller ※MVCパターンの場合 ルータ ルータ 裏話的な • スケジュール • 幻のパフォーマンスチューニング • エモい話 中身を知るメリット • Laravel は比較的制約のゆるいフレームワーク → 自由度が高い • ある程度ルールを決めないと簡単に壊れる • 機能をつくる、あるいは増やすときに より適切なアプローチを取れる • IDEの関数ジャンプの機能を使って コアのコードに触れてみるといいよ
  46. 46. Enjoy Laravel!

×