Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
index.phpの処理を追ってみた / Dive into index.php
Search
choco
April 23, 2019
Programming
580
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
index.phpの処理を追ってみた / Dive into index.php
laravel.osaka #14
choco
April 23, 2019
Other Decks in Programming
See All in Programming
ActionController meets Protocol Buffers
sorah
0
530
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
130
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
360
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.9k
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
150
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
R8 の設定見直しでアプリサイズ削減
andpad
0
220
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.6k
すこし踏み込む CancellationToken
htkym
2
1.7k
IBM Bob でAI駆動開発『QC-Playbook』
ichirokano2
0
110
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
32k
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
590
Featured
See All Featured
Bash Introduction
62gerente
615
220k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Raft: Consensus for Rubyists
vanstee
142
7.8k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
280
Speed Design
sergeychernyshev
33
2.2k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
500
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Site-Speed That Sticks
csswizardry
13
1.6k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Crafting Experiences
bethany
1
380
Transcript
index.php の処理を追ってみた @choco14t 2019/04/23 laravel.osaka #14
About me 増田 雄真(yuma masuda) choco14t(Twitter, GitHub) ブログチョットカイテマス https://choco14t.hatenablog.com works
at 株式会社i-plug Laravel は個人で少し触ったことがある程度
Table of contents index.php bootstrap/app.php Application クラスなどのメソッド コードは5.5 を基にしてます
Q. Laravel の使用頻度 業務でバリバリ使ってます! ちょっと使ったことがあります 全然わからない・PHP 触り始めたばかり etc...
Dive into index.php ......
index.php <?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);
bootstrap/app.php $app = require_once __DIR__.'/../bootstrap/app.php';
bootstrap/app.php Application のインスタンス生成 サービスプロバイダ エイリアス インスタンス生成 The kernels serve the
incoming requests to this application from both the web and CLI. “ “
<?php $app = new Illuminate\Foundation\Application( realpath(__DIR__.'/../') ); $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;
Container::singleton() Container::bind() を呼び出すだけ shared フラグをtrue にしている
Container::bind() public function bind( $abstract, $concrete = null, $shared =
false ) { $this->dropStaleInstances($abstract); if (is_null($concrete)) { $concrete = $abstract; } if (!$concrete instanceof Closure) { $concrete = $this->getClosure( $abstract, $concrete ); }
// 前のスライドの続き $this->bindings[$abstract] = compact( 'concrete', 'shared' ); if ($this->resolved($abstract))
{ $this->rebound($abstract); } }
Application::make() $kernel = $app->make( Illuminate\Contracts\Http\Kernel::class );
Application::make() (あれば)サービスプロバイダの遅延読込 依存オブジェクトの解決
public function make($abstract, array $parameters = []) { $abstract =
$this->getAlias($abstract); if (isset($this->deferredServices[$abstract]) && ! isset($this->instances[$abstract]) ) { $this->loadDeferredProvider($abstract); } // Container::resolve() を実行 return parent::make($abstract, $parameters); }
Container::resolve() 依存オブジェクトの生成 再帰的に依存オブジェクトを生成 Container::make() を再呼び出し
Container::build() 名の通りインスタンス生成 Re ection を使って実現 クラス、インターフェイス、関数、メソッド、そ して拡張モジュールについて リバースエンジニア リングを行うことができます。 https://www.php.net/manual/ja/intro.re
ection. php “ “
Http\Kernel::handle() $response = $kernel->handle( $request = Illuminate\Http\Request::capture() );
Http\Kernel::handle() ブートストラッピング con g facade service provider 対応したルーティングの処理実行 レスポンスの返却
public function handle($request) { try { $request->enableHttpMethodParameterOverride(); $response = $this->sendRequestThroughRouter($request);
} // catch は省略 $this->app['events']->dispatch( new Events\RequestHandled($request, $response) ); return $response; }
Http\Kernel.php // 本来は\Illuminate\Foundation\Bootstrap\ が記述されてます protected $bootstrappers = [ LoadEnvironmentVariables::class, LoadConfiguration::class,
HandleExceptions::class, RegisterFacades::class, RegisterProviders::class, BootProviders::class, ];
まとめ 実行するまでに膨大な処理が実行されている 簡単ではないですが、読むことは出来ます 学びが多いので全能感が得られる(錯覚)
フレームワークのコードを読もう!