時(shí)間:2023-05-01 19:48:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-05-01 19:48:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
ThinkPHP6源碼分析之應(yīng)用初始化:ThinkPHP6 源碼分析之應(yīng)用初始化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);}
● 從魔術(shù)的方法的參數(shù) rootPath 來(lái)看,是支持自定義根目錄路徑的。public function initialize(){ $this->initialized = true; $this->beginTime = microtime(true); $this->beginMem = memory_get_usage(); // 加載環(huán)境變量 if (is_file($this->rootPath . '.env')) { $this->env->load($this->rootPath . '.env'); } $this->configExt = $this->env->get('config_ext', '.php'); $this->debugModeInit(); // 加載全局初始化文件 $this->load(); // 加載框架默認(rèn)語(yǔ)言包 $langSet = $this->lang->defaultLangSet(); $this->lang->load($this->thinkPath . 'lang' . DIRECTORY_SEPARATOR . $langSet . '.php'); // 加載應(yīng)用默認(rèn)語(yǔ)言包 $this->loadLangPack($langSet); // 監(jiān)聽(tīng)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;}
● 加載 .env 環(huán)境變量文件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;}
● 服務(wù)是否注冊(cè)過(guò),如果需要強(qiáng)制重新注冊(cè)foreach ($this->initializers as $initializer) { $this->make($initializer)->init($this);}
這三個(gè)服務(wù)分別是:think/initializer/BootServicethink/initializer/Errorthink/initializer/RegisterService
● Error 服務(wù)是用來(lái)處理框架異常和錯(cuò)誤的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); } }}
該方法就很奇怪了,和我想象的有點(diǎn)不一樣。服務(wù)是直接從 runtime 目錄下面獲取的,而非在 config 目錄下的 service.php 中。為什么會(huì)這樣呢?由于 composer 的發(fā)展,TP 框架也可以提供包的自動(dòng)發(fā)現(xiàn)的功能,這也證明了開(kāi)發(fā)組在不斷向社區(qū)靠攏。下面來(lái)看一下是如何實(shí)現(xiàn)的。"scripts": { "post-autoload-dump": [ "@php think service:discover", "@php think vendor:publish" ]}
從配置來(lái)看,框架一共提供了兩個(gè)指令,service:discover 和 vendor:publish。具體實(shí)現(xiàn)這里就不說(shuō)了,你只需要知道包的發(fā)現(xiàn)是由 service:discover 實(shí)現(xiàn)的。PaginatorService::class,ValidateService::class,ModelService::class,
最后再來(lái)看看 BootService,這個(gè)就很簡(jiǎn)單了。從命名來(lái)講就不難看出,下面就是代碼,正常的啟動(dòng)服務(wù),但是這里要說(shuō)明的是,服務(wù)類中必須實(shí)現(xiàn)了 boot 方法才會(huì)啟動(dòng)。public function init(App $app){ $app->boot();}
以上就是ThinkPHP6源碼分析之應(yīng)用初始化的詳細(xì)內(nèi)容關(guān)鍵詞:分析
客戶&案例
營(yíng)銷資訊
關(guān)于我們
客戶&案例
營(yíng)銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。