이 글은 주로 Laravel 프레임워크의 라이프 사이클과 원리를 소개하고 있으며, 사용자 요청에 따라 Laravel 프레임워크의 전체 작동 주기, 프로세스, 원리를 예제 형식으로 요약하고 분석합니다.
이 문서의 예제는 Laravel 프레임워크의 수명을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.
소개:
도구 사용 원리를 잘 알면 이 도구를 사용할 때 자신감이 생길 것입니다!
텍스트:
사용자(브라우저)가 HTTP 요청을 보내면 Apache 또는 nginx는 일반적으로 index.php로 이동하므로 후속 단계는 모두 index.php에서 시작됩니다. 먼저 이 파일의 코드를 확인하세요.
<?php require __DIR__.'/../bootstrap/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php'; /* |-------------------------------------------------------------------------- | 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'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__.'/../') ); /* |-------------------------------------------------------------------------- | 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('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); } } }
여기에 인스턴스 함수가 나타납니다. 사실 이는 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의 하위 클래스이므로 < code>$app는 Application 클래스의 객체일 뿐만 아니라 Container의 객체이기도 합니다. 따라서 의 소스 코드 파일에서 새로운 $app
不仅是Application类的对象,还是Container的对象,所以,新出现的singleton函数我们就可以到Container类的源代码文件里查。bind函数和singleton的区别见这篇博文。
singleton这个函数,前一个参数是实际类名,后一个参数是类的“别名”。
$app
singleton 함수를 확인할 수 있습니다. 컨테이너 클래스. 바인드 함수와 싱글톤의 차이점은 이 블로그 게시물에서 확인할 수 있습니다. 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'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's route middleware groups. * * @var array */ protected $middlewareGroups = [ 'web' => [ \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 inpidually. * * @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, ]; }
$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 프레임워크의 수명주기 및 원리 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!