Laravel 프레임 워 크 수명 주기 와 원리 분석
머리말:
만약 당신 이 도구 의 사용 원 리 를 손금 보 듯 잘 알 고 있다 면, 당신 은 이 도 구 를 사용 할 때 자신 감 이 생 길 것 입 니 다!
본문:
사용자 (브 라 우 저) 가 HTTP 요청 을 보 내 면 apache 나 nginx 는 보통 index. php 로 전 환 됩 니 다. 따라서 다음 절 차 는 index. php 에서 시 작 됩 니 다. 이 파일 코드 를 먼저 살 펴 보 겠 습 니 다.
make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);
저 자 는 주석 에서 kernel 의 역할, kernel 의 역할, kernel 이 방문 요청 을 처리 하고 사용자 브 라 우 저 에 되 돌려 보 냅 니 다.
여기에 또 하나의 app 대상 이 관련 되 어 있 기 때문에 app 대상 을 첨부 합 니 다. 그래서 app 대상 의 소스 코드 를 첨부 합 니 다. 이 소스 코드 는 \ bootstrap \ app. php 입 니 다.
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 The Application
|--------------------------------------------------------------------------
|
| This script returns the application instance. The instance is given to
| the calling script so we can separate the building of the instances
| from the actual running of the application and sending responses.
|
*/
return $app;
app 변 수 는 Illuminate \ Foundation \ Application 류 의 대상 이 므 로 이러한 구조 함 수 를 호출 했 습 니 다. 구체 적 으로 무슨 일 을 했 는 지 원본 코드 를 보 겠 습 니 다.
public function __construct($basePath = null)
{
if ($basePath) {
$this->setBasePath($basePath);
}
$this->registerBaseBindings();
$this->registerBaseServiceProviders();
$this->registerCoreContainerAliases();
}
구조 기 는 세 가지 일 을 했 습 니 다. 앞의 두 가지 일 은 이해 하기 쉽 습 니 다. Container 를 만 들 고 ServiceProvider 에 등록 하여 코드 를 보 았 습 니 다.
/**
* Register the basic bindings into the container.
*
* @return void
*/
protected function registerBaseBindings()
{
static::setInstance($this);
$this->instance('app', $this);
$this->instance(Container::class, $this);
}
/**
* Register all of the base service providers.
*
* @return void
*/
protected function registerBaseServiceProviders()
{
$this->register(new EventServiceProvider($this));
$this->register(new LogServiceProvider($this));
$this->register(new RoutingServiceProvider($this));
}
마지막 으로 큰 배열 을 하고 많은 별명 을 정 의 했 는데 프로그래머 가 똑똑 하고 게으름뱅이 라 는 것 을 보 여 주 었 다.
/**
* Register the core class aliases in the container.
*
* @return void
*/
public function registerCoreContainerAliases()
{
$aliases = [
'app' => [\Illuminate\Foundation\Application::class, \Illuminate\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::class],
'auth' => [\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class],
'auth.driver' => [\Illuminate\Contracts\Auth\Guard::class],
'blade.compiler' => [\Illuminate\View\Compilers\BladeCompiler::class],
'cache' => [\Illuminate\Cache\CacheManager::class, \Illuminate\Contracts\Cache\Factory::class],
'cache.store' => [\Illuminate\Cache\Repository::class, \Illuminate\Contracts\Cache\Repository::class],
'config' => [\Illuminate\Config\Repository::class, \Illuminate\Contracts\Config\Repository::class],
'cookie' => [\Illuminate\Cookie\CookieJar::class, \Illuminate\Contracts\Cookie\Factory::class, \Illuminate\Contracts\Cookie\QueueingFactory::class],
'encrypter' => [\Illuminate\Encryption\Encrypter::class, \Illuminate\Contracts\Encryption\Encrypter::class],
'db' => [\Illuminate\Database\DatabaseManager::class],
'db.connection' => [\Illuminate\Database\Connection::class, \Illuminate\Database\ConnectionInterface::class],
'events' => [\Illuminate\Events\Dispatcher::class, \Illuminate\Contracts\Events\Dispatcher::class],
'files' => [\Illuminate\Filesystem\Filesystem::class],
'filesystem' => [\Illuminate\Filesystem\FilesystemManager::class, \Illuminate\Contracts\Filesystem\Factory::class],
'filesystem.disk' => [\Illuminate\Contracts\Filesystem\Filesystem::class],
'filesystem.cloud' => [\Illuminate\Contracts\Filesystem\Cloud::class],
'hash' => [\Illuminate\Contracts\Hashing\Hasher::class],
'translator' => [\Illuminate\Translation\Translator::class, \Illuminate\Contracts\Translation\Translator::class],
'log' => [\Illuminate\Log\Writer::class, \Illuminate\Contracts\Logging\Log::class, \Psr\Log\LoggerInterface::class],
'mailer' => [\Illuminate\Mail\Mailer::class, \Illuminate\Contracts\Mail\Mailer::class, \Illuminate\Contracts\Mail\MailQueue::class],
'auth.password' => [\Illuminate\Auth\Passwords\PasswordBrokerManager::class, \Illuminate\Contracts\Auth\PasswordBrokerFactory::class],
'auth.password.broker' => [\Illuminate\Auth\Passwords\PasswordBroker::class, \Illuminate\Contracts\Auth\PasswordBroker::class],
'queue' => [\Illuminate\Queue\QueueManager::class, \Illuminate\Contracts\Queue\Factory::class, \Illuminate\Contracts\Queue\Monitor::class],
'queue.connection' => [\Illuminate\Contracts\Queue\Queue::class],
'queue.failer' => [\Illuminate\Queue\Failed\FailedJobProviderInterface::class],
'redirect' => [\Illuminate\Routing\Redirector::class],
'redis' => [\Illuminate\Redis\RedisManager::class, \Illuminate\Contracts\Redis\Factory::class],
'request' => [\Illuminate\Http\Request::class, \Symfony\Component\HttpFoundation\Request::class],
'router' => [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class],
'session' => [\Illuminate\Session\SessionManager::class],
'session.store' => [\Illuminate\Session\Store::class, \Illuminate\Contracts\Session\Session::class],
'url' => [\Illuminate\Routing\UrlGenerator::class, \Illuminate\Contracts\Routing\UrlGenerator::class],
'validator' => [\Illuminate\Validation\Factory::class, \Illuminate\Contracts\Validation\Factory::class],
'view' => [\Illuminate\View\Factory::class, \Illuminate\Contracts\View\Factory::class],
];
foreach ($aliases as $key => $aliases) {
foreach ($aliases as $alias) {
$this->alias($key, $alias);
}
}
}
여기에 instance 함수 가 나 타 났 습 니 다. 사실 이것 은 Application 류 의 함수 가 아니 라 Application 류 의 부모 클래스 Container 류 의 함수 입 니 다.
/**
* Register an existing instance as shared in the container.
*
* @param string $abstract
* @param mixed $instance
* @return void
*/
public function instance($abstract, $instance)
{
$this->removeAbstractAlias($abstract);
unset($this->aliases[$abstract]);
// We'll check to determine if this type has been bound before, and if it has
// we will fire the rebound callbacks registered with the container and it
// can be updated with consuming classes that have gotten resolved here.
$this->instances[$abstract] = $instance;
if ($this->bound($abstract)) {
$this->rebound($abstract);
}
}
Application 은 Container 의 하위 클래스 이기 때문에
$app
Application 류 의 대상 일 뿐만 아니 라 Container 의 대상 이기 때문에 새로 나타 난 singleton 함 수 는 Container 류 의 소스 코드 파일 에서 찾 을 수 있 습 니 다.bind 함수 와 singleton 의 차 이 는 이 박문 을 볼 수 있다.singleton 이 함 수 는 앞의 매개 변 수 는 실제 클래스 이름 이 고 뒤의 매개 변 수 는 클래스 의 '별명' 입 니 다.
$app
대상 은 HttpKernel, ConsoleKernel, ExceptionHandler 등 3 개의 단일 모델 대상 을 밝 혔 다.여 기 는 대상 을 만 들 지 않 았 습 니 다. 성명 만 했 을 뿐 '별명' 만 만 들 었 습 니 다.index. php 에 도 $kernel 변수 가 있 지만 make 에서 나 온 HttpKernel 변수 만 저장 되 어 있 기 때문에 본 고 는 'ConsoleKernel, ExceptionHandler' 에 대해 서 는 더 이상 논의 하지 않 습 니 다.
계속해서 폴 더 아래 에서 App \ Http \ Kernel. php 를 찾 습 니 다. 실제 Http Kernel 이 한 일 을 이 php 파일 에 썼 으 니 이 코드 에서 도대체 무슨 일 을 했 는 지 볼 까요?
[
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'mymiddleware'=>\App\Http\Middleware\MyMiddleware::class,
];
}
HttpKernel 에 서 는 미들웨어 배열 을 한눈 에 정의 합 니 다.
할 일이 끝나 면 응답 을 요청 하 는 과정 이 시 작 됩 니 다. index. php 참조
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();
마지막 으로 모든 자원 을 방출 하 는 것 을 중단 합 니 다.
/**
* Call the terminate method on any terminable middleware.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Http\Response $response
* @return void
*/
public function terminate($request, $response)
{
$this->terminateMiddleware($request, $response);
$this->app->terminate();
}
요약 하면 전체 과정 을 간단하게 요약 하면:
1. index. php 에 \ bootstrap \ \ app. php 를 불 러 옵 니 다. Application 류 의 구조 함수 에 Container 를 만 들 고 ServiceProvider 를 등록 하여 별명 배열 을 정의 한 다음 app 변수 로 구조 함수 로 구 성 된 대상 을 저장 합 니 다.
2. app 이라는 대상 을 사용 하여 단일 모드 의 대상 HttpKernel 을 만 들 고 HttpKernel 을 만 들 때 구조 함 수 를 호출 하여 미들웨어 의 설명 을 완성 합 니 다.
3. 이상 의 작업 은 방문 을 요청 하기 전에 이 루어 졌 습 니 다. 그 다음 에 요청 을 기다 리 기 시 작 했 습 니 다. 그 다음 에 요청 을 받 았 습 니 다 -- > 처리 요청 -- > 응답 보 내기 -- > app 변 수 를 중단 합 니 다.
Laravel 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 는 Laravel 프레임 워 크 를 바탕 으로 하 는 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.