Laravel 프레임워크의 수명주기 및 원리 분석

不言
풀어 주다: 2023-03-31 19:58:02
원래의
1623명이 탐색했습니다.

이 글은 주로 Laravel 프레임워크의 라이프 사이클과 원리를 소개하고 있으며, 사용자 요청에 따라 Laravel 프레임워크의 전체 작동 주기, 프로세스, 원리를 예제 형식으로 요약하고 분석합니다.

이 문서의 예제는 Laravel 프레임워크의 수명을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

소개:

도구 사용 원리를 잘 알면 이 도구를 사용할 때 자신감이 생길 것입니다!

텍스트:

사용자(브라우저)가 HTTP 요청을 보내면 Apache 또는 nginx는 일반적으로 index.php로 이동하므로 후속 단계는 모두 index.php에서 시작됩니다. 먼저 이 파일의 코드를 확인하세요.

<?php
require __DIR__.&#39;/../bootstrap/autoload.php&#39;;
$app = require_once __DIR__.&#39;/../bootstrap/app.php&#39;;
/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client&#39;s browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
  $request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);
로그인 후 복사

저자는 댓글에서 커널의 역할에 대해 이야기했습니다. 커널은 들어오는 요청을 처리하고 해당 응답을 사용자의 브라우저로 다시 보냅니다.

여기에도 앱 개체가 포함되어 있으므로 앱 개체의 소스 코드가 첨부됩니다. 이 소스 코드는 bootstrapapp.php

<?php
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| The first thing we will do is create a new Laravel application instance
| which serves as the "glue" for all the components of Laravel, and is
| the IoC container for the system binding all of the various parts.
|
*/
$app = new Illuminate\Foundation\Application(
  realpath(__DIR__.&#39;/../&#39;)
);
/*
|--------------------------------------------------------------------------
| Bind Important Interfaces
|--------------------------------------------------------------------------
|
| Next, we need to bind some important interfaces into the container so
| we will be able to resolve them when needed. The kernels serve the
| incoming requests to this application from both the web and CLI.
|
*/
$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 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;
로그인 후 복사

앱 변수임을 확인하시기 바랍니다. IlluminateFoundationApplication 클래스 개체에 속하므로 이 클래스의 생성자가 정확히 무엇을 하는지 소스 코드를 살펴보겠습니다.

public function __construct($basePath = null)
{
  if ($basePath) {
    $this->setBasePath($basePath);
  }
  $this->registerBaseBindings();
  $this->registerBaseServiceProviders();
  $this->registerCoreContainerAliases();
}
로그인 후 복사

생성자는 3가지 작업을 수행합니다. 처음 두 가지는 컨테이너 생성, ServiceProvider 등록, 코드 살펴보기

/**
 * Register the basic bindings into the container.
 *
 * @return void
 */
protected function registerBaseBindings()
{
  static::setInstance($this);
  $this->instance(&#39;app&#39;, $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 = [
    &#39;app&#39;         => [\Illuminate\Foundation\Application::class, \Illuminate\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::class],
    &#39;auth&#39;         => [\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class],
    &#39;auth.driver&#39;     => [\Illuminate\Contracts\Auth\Guard::class],
    &#39;blade.compiler&#39;    => [\Illuminate\View\Compilers\BladeCompiler::class],
    &#39;cache&#39;        => [\Illuminate\Cache\CacheManager::class, \Illuminate\Contracts\Cache\Factory::class],
    &#39;cache.store&#39;     => [\Illuminate\Cache\Repository::class, \Illuminate\Contracts\Cache\Repository::class],
    &#39;config&#39;        => [\Illuminate\Config\Repository::class, \Illuminate\Contracts\Config\Repository::class],
    &#39;cookie&#39;        => [\Illuminate\Cookie\CookieJar::class, \Illuminate\Contracts\Cookie\Factory::class, \Illuminate\Contracts\Cookie\QueueingFactory::class],
    &#39;encrypter&#39;      => [\Illuminate\Encryption\Encrypter::class, \Illuminate\Contracts\Encryption\Encrypter::class],
    &#39;db&#39;          => [\Illuminate\Database\DatabaseManager::class],
    &#39;db.connection&#39;    => [\Illuminate\Database\Connection::class, \Illuminate\Database\ConnectionInterface::class],
    &#39;events&#39;        => [\Illuminate\Events\Dispatcher::class, \Illuminate\Contracts\Events\Dispatcher::class],
    &#39;files&#39;        => [\Illuminate\Filesystem\Filesystem::class],
    &#39;filesystem&#39;      => [\Illuminate\Filesystem\FilesystemManager::class, \Illuminate\Contracts\Filesystem\Factory::class],
    &#39;filesystem.disk&#39;   => [\Illuminate\Contracts\Filesystem\Filesystem::class],
    &#39;filesystem.cloud&#39;   => [\Illuminate\Contracts\Filesystem\Cloud::class],
    &#39;hash&#39;         => [\Illuminate\Contracts\Hashing\Hasher::class],
    &#39;translator&#39;      => [\Illuminate\Translation\Translator::class, \Illuminate\Contracts\Translation\Translator::class],
    &#39;log&#39;         => [\Illuminate\Log\Writer::class, \Illuminate\Contracts\Logging\Log::class, \Psr\Log\LoggerInterface::class],
    &#39;mailer&#39;        => [\Illuminate\Mail\Mailer::class, \Illuminate\Contracts\Mail\Mailer::class, \Illuminate\Contracts\Mail\MailQueue::class],
    &#39;auth.password&#39;    => [\Illuminate\Auth\Passwords\PasswordBrokerManager::class, \Illuminate\Contracts\Auth\PasswordBrokerFactory::class],
    &#39;auth.password.broker&#39; => [\Illuminate\Auth\Passwords\PasswordBroker::class, \Illuminate\Contracts\Auth\PasswordBroker::class],
    &#39;queue&#39;        => [\Illuminate\Queue\QueueManager::class, \Illuminate\Contracts\Queue\Factory::class, \Illuminate\Contracts\Queue\Monitor::class],
    &#39;queue.connection&#39;   => [\Illuminate\Contracts\Queue\Queue::class],
    &#39;queue.failer&#39;     => [\Illuminate\Queue\Failed\FailedJobProviderInterface::class],
    &#39;redirect&#39;       => [\Illuminate\Routing\Redirector::class],
    &#39;redis&#39;        => [\Illuminate\Redis\RedisManager::class, \Illuminate\Contracts\Redis\Factory::class],
    &#39;request&#39;       => [\Illuminate\Http\Request::class, \Symfony\Component\HttpFoundation\Request::class],
    &#39;router&#39;        => [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class],
    &#39;session&#39;       => [\Illuminate\Session\SessionManager::class],
    &#39;session.store&#39;    => [\Illuminate\Session\Store::class, \Illuminate\Contracts\Session\Session::class],
    &#39;url&#39;         => [\Illuminate\Routing\UrlGenerator::class, \Illuminate\Contracts\Routing\UrlGenerator::class],
    &#39;validator&#39;      => [\Illuminate\Validation\Factory::class, \Illuminate\Contracts\Validation\Factory::class],
    &#39;view&#39;         => [\Illuminate\View\Factory::class, \Illuminate\Contracts\View\Factory::class],
  ];
  foreach ($aliases as $key => $aliases) {
    foreach ($aliases as $alias) {
      $this->alias($key, $alias);
    }
  }
}
로그인 후 복사

여기에 인스턴스 함수가 ​​나타납니다. 사실 이는 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&#39;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의 하위 클래스이므로 < code>$app는 Application 클래스의 객체일 뿐만 아니라 Container의 객체이기도 합니다. 따라서 의 소스 코드 파일에서 새로운 $app不仅是Application类的对象,还是Container的对象,所以,新出现的singleton函数我们就可以到Container类的源代码文件里查。bind函数和singleton的区别见这篇博文。

singleton这个函数,前一个参数是实际类名,后一个参数是类的“别名”。

$appsingleton 함수를 확인할 수 있습니다. 컨테이너 클래스. 바인드 함수와 싱글톤의 차이점은 이 블로그 게시물에서 확인할 수 있습니다. singleton 이 함수의 첫 번째 매개변수는 실제 클래스 이름이고, 뒤의 매개변수는 클래스의 "별칭"입니다. $app 객체는 3개의 싱글톤 모델 객체, 즉 HttpKernel

,

ConsoleKernel

,

ExceptionHandler을 선언합니다. 여기서는 객체가 생성되지 않으며 단지 선언과 "별칭"

일 뿐이라는 점에 유의하세요.

index.php에도 $kernel 변수가 있지만 make의 HttpKernel 변수만 저장되므로 이 기사에서는 ConsoleKernel 및 ExceptionHandler에 대해 논의하지 않습니다. . .

계속해서 폴더에서

AppHttpKernel.php

를 찾으세요. HttpKernel이 수행하는 모든 실제 작업을 이 PHP 파일에 작성했으므로 이 코드에서 정확히 수행되는 작업을 살펴보겠습니다.

<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
  /**
   * The application&#39;s global HTTP middleware stack.
   *
   * These middleware are run during every request to your application.
   *
   * @var array
   */
  protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    //\App\Http\Middleware\MyMiddleware::class,
  ];
  /**
   * The application&#39;s route middleware groups.
   *
   * @var array
   */
  protected $middlewareGroups = [
    &#39;web&#39; => [
      \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,
    ],
    &#39;api&#39; => [
      &#39;throttle:60,1&#39;,
    ],
  ];
  /**
   * The application&#39;s route middleware.
   *
   * These middleware may be assigned to groups or used inpidually.
   *
   * @var array
   */
  protected $routeMiddleware = [
    &#39;auth&#39; => \App\Http\Middleware\Authenticate::class,
    &#39;auth.basic&#39; => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    &#39;guest&#39; => \App\Http\Middleware\RedirectIfAuthenticated::class,
    &#39;throttle&#39; => \Illuminate\Routing\Middleware\ThrottleRequests::class,
  &#39;mymiddleware&#39;=>\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는 bootstrapapp.php을 로드하고, Application 클래스의 생성자에 컨테이너를 생성하고, ServiceProvider를 등록합니다. 별칭 array 를 정의한 다음 app 변수를 사용하여 생성자가 생성한 객체를 저장합니다. 2. 앱 개체를 사용하여 싱글톤 모드 개체 HttpKernel을 만듭니다. HttpKernel을 만들 때 생성자가 호출되어 미들웨어 선언을 완료합니다. 3. 방문을 요청하기 전에 위 작업이 완료됩니다. 그런 다음 요청을 기다린 후 요청 수락

-->

요청 처리

-->

응답 보내기

--> ;

앱 변수 중지

위 내용은 모두의 학습에 도움이 되기를 바랍니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트를 주목하세요.

관련 권장 사항:
Laravel 프레임워크는 미들웨어를 사용하여 작업 로깅 기능을 구현합니다.

Laravel 프레임워크는 리스너를 사용하여 SQL 문 기록 기능을 구현합니다.

Laravel 프레임워크 라우팅 설정

🎜🎜🎜 🎜🎜🎜🎜

위 내용은 Laravel 프레임워크의 수명주기 및 원리 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!