ThinkPHP6 ソース コード分析アプリケーションの初期化
App Construct
まず、基本的に任意のフレームワークである __construct で何が行われるかを見てみましょう。ここでいくつかの基本的な操作を実行します。つまり、ここから拡張します。
public function __construct(string $rootPath = '') { $this->thinkPath = dirname(__DIR__) . DIRECTORY_SEPARATOR; $this->rootPath = $rootPath ? rtrim($rootPath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR : $this->getDefaultRootPath(); $this->appPath = $this->rootPath . 'app' . DIRECTORY_SEPARATOR; $this->runtimePath = $this->rootPath . 'runtime' . DIRECTORY_SEPARATOR; if (is_file($this->appPath . 'provider.php')) { $this->bind(include $this->appPath . 'provider.php'); } static::setInstance($this); $this->instance('app', $this); $this->instance('think\Container', $this); }
# マジック メソッドのパラメータ rootPath から判断すると、ルート ディレクトリ パスのカスタマイズをサポートしています。
# thinkPath、rootPath、appPath、runtimePath を設定します
# デフォルトのサービス プロバイダーをバインドし、app\Reques と app\ExceptionHandle の合計 2 つを提供します。実際に使用するのは Request です。 。具体的には、appPath に移動して表示します。
● 現在のコンテナ インスタンスを設定します。APP
● App($this) インスタンスをコンテナ、それぞれ app と think\Container
にバインドします。 App クラスは Container を継承するため、独自のインスタンスをコンテナにバインドすることに注意してください。
ここでアプリケーション全体が初期化されたようですね?ここでは、Request run の内容の一部をここに置く必要がありますが、これはフレームワークの主な初期化作業であるためですが、初期化作業のこの部分を Request run に置くのは合理的ではないと思います。
#メイン初期化
public function initialize() { $this->initialized = true; $this->beginTime = microtime(true); $this->beginMem = memory_get_usage(); // 加载环境变量 if (is_file($this->rootPath . '.env')) { $this->env->load($this->rootPath . '.env'); } $this->configExt = $this->env->get('config_ext', '.php'); $this->debugModeInit(); // 加载全局初始化文件 $this->load(); // 加载框架默认语言包 $langSet = $this->lang->defaultLangSet(); $this->lang->load($this->thinkPath . 'lang' . DIRECTORY_SEPARATOR . $langSet . '.php'); // 加载应用默认语言包 $this->loadLangPack($langSet); // 监听AppInit $this->event->trigger('AppInit'); date_default_timezone_set($this->config->get('app.default_timezone', 'Asia/Shanghai')); // 初始化 foreach ($this->initializers as $initializer) { $this->make($initializer)->init($this); } return $this; }
## 設定ファイルとアプリケーション内のファイルの読み込み
● アプリケーションに common.php
をロードします。 ● thinkPath ディレクトリの helper.php
# にヘルパー関数をロードします。 ● 構成ファイルをロードします。
## ● イベントをロードします。 php イベント##● アプリケーション ディレクトリに service.php サービスを登録します
##● 言語パックをロードします##● AppInit イベントをリッスンしてこれを使用しますリクエスト前の作業を行うためのイベント
● タイムゾーンの設定
##● すべてのサービスを挿入してサービスを開始する##サービス登録 ## 初期化プロセス中にサービス登録を実行します。サービス登録は何を行うのでしょうか?サービスの利用方法は?public function register($service, bool $force = false) { $registered = $this->getService($service); if ($registered && !$force) { return $registered; } if (is_string($service)) { $service = new $service($this); } if (method_exists($service, 'register')) { $service->register(); } if (property_exists($service, 'bind')) { $this->bind($service->bind); } $this->services[] = $service; }
#● サービスのインスタンス化
# register メソッドが実装されている場合は、次のことが必要です。 register メソッドを実行します● バインド属性が設定されている場合は、サービス インスタンスをコンテナにバインドする必要があります
#● 最後にサービス インスタンスをサービス配列全体にマージし、ブートを待ちます開始するサービス
現在、初期化中に存在するサービスは次の 3 つだけです。$this->initializers 配列では、foreach ($this->initializers as $initializer) { $this->make($initializer)->init($this); }
think\initializer\BootService think\initializer\Error think\initializer\RegisterService
#● RegisterService は文字通りサービスを登録することを意味します
#● BootService はサービスを有効にすることですエラー処理については後で説明します。ここでは RegisterService と BootService を見てみましょう。
RegisterServiceをContainerから作る場合隠れた静的メソッドmakeがあり、初めてContainerからインスタンスオブジェクトを作るたびにmakeメソッドが実行されます。まずメソッドを実装する必要があります。 Init メソッドが実行されます。 RegisterService を入力すると、このメソッドが表示されます。メソッドの内容は次のとおりです。public function init(App $app) { $file = $app->getRootPath() . 'runtime' . DIRECTORY_SEPARATOR . 'services.php'; $services = $this->services; if (is_file($file)) { $services = array_merge($services, include $file); } foreach ($services as $service) { if (class_exists($service)) { $app->register($service); } } }
"scripts": { "post-autoload-dump": [ "@php think service:discover", "@php think vendor:publish" ] }
PaginatorService::class, ValidateService::class, ModelService::class,
public function init(App $app) { $app->boot(); }
http://www.php.cn/phpkj/thinkphp/
以上がThinkPHP6 ソースコード分析アプリケーションの初期化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。