Laravel 에서 ServiceProvider 가 호출되는 과정
index.php
browser 에서 url 쳐서 request 를 하면 일단 server.php 를 거쳐서./public/index.php 로 가게 된다.
server.php 는 apache 등의 web server 의 emulation 을 하기 때문에 실제로 publishing 에 쓰이지는 않는다.
결국 index.php 가 시작점이라고 보면 된다.
여기서 kernel 를 만드는데,
... $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); $response = $kernel->handle( $request = Illuminate\Http\Request::capture() ); $response->send(); $kernel->terminate($request, $response);이 kernel 은 아래 같은 데이터 구조(data structure)이다.
App\Http\Kernel middleware:array(4) middlewareGroups:array(2) routeMiddleware:array(6) app:Illuminate\Foundation\Application router:Illuminate\Routing\Router bootstrappers:array(6) middlewarePriority:array(6)
ServiceProvider의 boot() 호출
처음에 index.php 를 호출하면, 여기서 Kernel->handle() 을 호출한다. 그래서 결국 Application::boot() 을 호출하는데, 여기서 ServiceProvider 들에 대해서 Application->bootProvider() 를 호출한다. (아래 stack trace 참고)source 를 보면 알지만, bootProvider() 에서는 Application 이 가지고 있는 ServiceProvider 들중에 boot() 함수가 있는 녀석만 call 을 하게 된다.
// Stack trace index.php Illuminate\Foundation\Http\Kernel->handle Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter Illuminate\Foundation\Http\Kernel->bootstrap Illuminate\Foundation\Application->bootstrapWith Illuminate\Foundation\Bootstrap\BootProviders->bootstrap Illuminate\Foundation\Application->boot Illuminate\Foundation\Application->bootProvider
class BootProviders { public function bootstrap(Application $app) { $app->boot(); } } class Application extends Container implements ApplicationContract, HttpKernelInterface { /** * The Laravel framework version. * * @var string */ const VERSION = '5.4.23'; ... public function boot() { if ($this->booted) { return; } // Once the application has booted we will also fire some "booted" callbacks // for any listeners that need to do work after this initial booting gets // finished. This is useful when ordering the boot-up processes we run. $this->fireAppCallbacks($this->bootingCallbacks); array_walk($this->serviceProviders, function ($p) { $this->bootProvider($p); }); $this->booted = true; $this->fireAppCallbacks($this->bootedCallbacks); } $this->serviceProviders Illuminate\Events\EventServiceProvider Illuminate\Log\LogServiceProvider Illuminate\Routing\RoutingServiceProvider Illuminate\Auth\AuthServiceProvider Illuminate\Cookie\CookieServiceProvider Illuminate\Database\DatabaseServiceProvider Illuminate\Encryption\EncryptionServiceProvider Illuminate\Filesystem\FilesystemServiceProvider Illuminate\Foundation\Providers\FormRequestServiceProvider Illuminate\Foundation\Providers\FoundationServiceProvider Illuminate\Notifications\NotificationServiceProvider Illuminate\Pagination\PaginationServiceProvider Illuminate\Session\SessionServiceProvider Illuminate\View\ViewServiceProvider App\Providers\AppServiceProvider App\Providers\AuthServiceProvider App\Providers\EventServiceProvider App\Providers\RouteServiceProvider class Application extends Container implements ApplicationContract, HttpKernelInterface { ... protected function bootProvider(ServiceProvider $provider) { if (method_exists($provider, 'boot')) { return $this->call([$provider, 'boot']); } } ... }
댓글 없음:
댓글 쓰기