ホームページ >バックエンド開発 >PHPチュートリアル >Laravelフレームワークのライフサイクルと原則の分析
この記事では、Laravel フレームワークのライフサイクルと原則を主に紹介し、ユーザーの要望に応じて Laravel フレームワークの完全な動作サイクル、プロセス、原則をサンプルの形式で要約および分析します。この記事へ
例では、Laravel フレームワークのライフサイクルと原則について説明します。参考のために皆さんと共有してください。詳細は次のとおりです。
はじめに:
ツールの使用原理をよく知っている場合なら、あなたはこのツールを自信を持って使用できます。
Text:
ユーザー (ブラウザー) が 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);
著者はコメントでカーネルの役割について述べています。カーネルは受信リクエストを処理し、対応する応答をユーザーのブラウザに送り返します。
ここでもアプリ オブジェクトが関与しているため、アプリ オブジェクトがアタッチされます。このソース コードは \bootstrap\app.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;app 変数は
Illuminate\Foundation\Application クラスのオブジェクトであるため、このクラスのコンストラクターが呼び出されることを確認してください。具体的に何が行われるのか、ソースコードを見てみましょう。
public function __construct($basePath = null) { if ($basePath) { $this->setBasePath($basePath); } $this->registerBaseBindings(); $this->registerBaseServiceProviders(); $this->registerCoreContainerAliases(); }コンストラクターは 3 つのことを行います。最初の 2 つは、コードを見てください。
##
/** * 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 クラスの関数ではなく、親クラスである 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 のオブジェクトでもあるため、Container クラスのソース コード ファイルで新しいsingleton 関数を確認できます。バインド関数とシングルトンの違いについては、このブログ投稿を参照してください。
singleton
$app
オブジェクトは、HttpKernel、
ConsoleKernel、ExceptionHandler という 3 つのシングルトン モデル オブジェクトを宣言します。 ここではオブジェクトは作成されず、宣言されただけであり、単なる「エイリアス」であることに注意してください。 index.php には $kernel 変数もありますが、保存されるのは make によって生成された HttpKernel 変数だけであることに気づきましたか。そのため、この記事では ConsoleKernel と ExceptionHandler については説明しません。 。 。
App\Http\Kernel.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, ]; }ミドルウェア配列が 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 クラスのコンストラクターでコンテナーを作成し、ServiceProvider を登録し、エイリアス配列を定義してから、app 変数を使用してコンストラクターによって構築されたオブジェクトを保存します。2. アプリ オブジェクトを使用して、シングルトン モード オブジェクト HttpKernel を作成します。HttpKernel を作成するときに、コンストラクターが呼び出されてミドルウェアの宣言が完了します。
3. 訪問をリクエストする前に上記の作業が完了しました。次に、リクエストを待ち始めます。リクエストを受け入れます#-->
リクエストを処理します-->応答を送信-->アプリ変数を停止上記はこの記事の全内容です。お役に立てば幸いです。誰もが学習しており、より関連性の高い内容については、PHP 中国語 Web サイトに注目してください。 関連する推奨事項:
Laravel フレームワークは、操作ログ機能用のミドルウェアの使用を実装します。Laravel フレームワークは、SQL のリスナーの使用を実装します。ステートメント レコード関数
# ##################################
以上がLaravelフレームワークのライフサイクルと原則の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。