你知道Laravel的$this->app以及app()是怎么來的嗎?

下面由laravel教程欄目給大家介紹laravel的$this->app以及app()是怎么來的,希望對需要的朋友有所幫助!

斷點調試尋找對應文件,忽略次要步驟,僅描述核心動作,‘/’表示index.php所在目錄

地址:index.php

$app?=?require_once?__DIR__.'/../bootstrap/app.php';

$app初始化

路徑/…/bootstrap/app.php

$app?=?new?IlluminateFoundationApplication( ????realpath(__DIR__.'/../') );//$app初始化工作

$app初始化的類及構造函數

class?Application?extends?Container?implements?ApplicationContract,HttpKernelInterface { ????//繼承Container類,Container類實現應用契約接口與請求接口 ????public?function?__construct($basePath?=?null){ ???????if?($basePath)?{//$basePath?=?'/../' ???????????$this->setBasePath($basePath);//路徑綁定 ???????} ???????$this->registerBaseBindings();//基礎綁定 ???????$this->registerBaseServiceProviders();//注冊基礎服務提供者 ???????$this->registerCoreContainerAliases();//注冊別名 ????} }

路徑綁定

Application的setBasePath(’/…/’)方法調用Container的instance(a?b?s?t?r?a?c?t?,?abstract,abstract,instance)方法賦值Contaienr類instances instances:?array:9?[▼ “path”?=>?“varwwwapp” “path.base”?=>?“varwww” “path.lang”?=>?“varwwwresourceslang” “path.config”?=>?“varwwwconfig” “path.public”?=>?“varwwwpublic” “path.storage”?=>?“varwwwstorage” “path.database”?=>?“varwwwdatabase” “path.resources”?=>?“varwwwresources” “path.bootstrap”?=>?“varwwwbootstrap” ]

基礎綁定

? 向Container的instances中添加綁定

????"app"?=>?Application?{#2} ??????"IlluminateContainerContainer"?=>?Application?{#2} ??????"IlluminateFoundationPackageManifest"?=>?PackageManifest?{#4?▼ ????????????+files:?Filesystem?{#5} ????????????+basePath:?"varwww" ????????????+vendorPath:?"varwwwvendor" ????????????+manifestPath:?"varwwwbootstrapcachepackages.php" ????????????+manifest:?null ????????}

? ? app與Container指向當前實例

? ? PackageMainfest 為包管理實例,構造方法中files注冊文件系統實例

注冊基礎服務提供者

//class?Application protected?function?registerBaseServiceProviders() { ????$this->register(new?EventServiceProvider($this)); ????$this->register(new?LogServiceProvider($this)); ????$this->register(new?RoutingServiceProvider($this)); }

Event、Log、Routing基礎服務繼承ServiceProvider,初始化的時候將app屬性賦值Application實例

//class?ServiceProvider???? public?function?__construct($app) { ????$this->app?=?$app; }

執行Application類register方法

//Application public?function?register($provider,?$options?=?[],?$force?=?false) { ????if?(is_string($provider))?{ ????????$provider?=?$this->resolveProvider($provider); ????} ????if?(method_exists($provider,?'register'))?{ ????????$provider->register();//賦值bindings ????} ????//將服務提供者添加到serviceProviders屬性隊列 ????//將服務提供者類名添加到loaderProviders屬性 ????$this->markAsRegistered($provider); ????return?$provider; }

為provider注冊提供了兩種方法;

一種是字符串類名直接實例,

一種是執行$$provider->register()方法注冊,

當前執行第二種方法,

回看當前EventServiceProvider實例的register方法

public?function?register() { ????$this->app->singleton('events',?function?($app)?{ ????????return?(new?Dispatcher($app))->setQueueResolver(function?()?use?($app)?{ ????????????return?$app->make(QueueFactoryContract::class); ????????}); ????}); }

調用Application實例的singleton方法

//class?Continer public?function?singleton($abstract,?$concrete?=?null) { ????$this->bind($abstract,?$concrete,?true); }

調用bind方法,賦值bindings

//class?Container public?function?bind($abstract,?$concrete?=?null,?$shared?=?false) { ????if?(is_null($concrete))?{ ????????$concrete?=?$abstract; ????} ????if?(!?$concrete?instanceof?Closure)?{ ????????$concrete?=?$this->getClosure($abstract,?$concrete); ????} ????$this->bindings[$abstract]?=?compact('concrete',?'shared'); }

回到Application類register方法中并執行markAsRegistered($provider)

//class?Application protected?function?markAsRegistered($provider) { ????$this->serviceProviders[]?=?$provider; ????$this->loadedProviders[get_class($provider)]?=?true; }

LogServerProvider、RoutingServiceProvider與之類似

別名綁定

//class?Application public?function?registerCoreContainerAliases() { ????foreach?([ ????????'app'??????????????????=>?[self::class,?IlluminateContractsContainerContainer::class,?IlluminateContractsFoundationApplication::class,??PsrContainerContainerInterface::class], ????????'auth'?????????????????=>?[IlluminateAuthAuthManager::class,?IlluminateContractsAuthFactory::class], ????????'auth.driver'??????????=>?[IlluminateContractsAuthGuard::class], ????????'blade.compiler'???????=>?[IlluminateViewCompilersBladeCompiler::class], ????????'cache'????????????????=>?[IlluminateCacheCacheManager::class,?IlluminateContractsCacheFactory::class], ????????'cache.store'??????????=>?[IlluminateCacheRepository::class,?IlluminateContractsCacheRepository::class], ????????'config'???????????????=>?[IlluminateConfigRepository::class,?IlluminateContractsConfigRepository::class], ????????'cookie'???????????????=>?[IlluminateCookieCookieJar::class,?IlluminateContractsCookieFactory::class,?IlluminateContractsCookieQueueingFactory::class], ????????'encrypter'????????????=>?[IlluminateEncryptionEncrypter::class,?IlluminateContractsEncryptionEncrypter::class], ????????'db'???????????????????=>?[IlluminateDatabaseDatabaseManager::class], ????????'db.connection'????????=>?[IlluminateDatabaseConnection::class,?IlluminateDatabaseConnectionInterface::class], ????????'events'???????????????=>?[IlluminateEventsDispatcher::class,?IlluminateContractsEventsDispatcher::class], ????????'files'????????????????=>?[IlluminateFilesystemFilesystem::class], ????????'filesystem'???????????=>?[IlluminateFilesystemFilesystemManager::class,?IlluminateContractsFilesystemFactory::class], ????????'filesystem.disk'??????=>?[IlluminateContractsFilesystemFilesystem::class], ????????'filesystem.cloud'?????=>?[IlluminateContractsFilesystemCloud::class], ????????'hash'?????????????????=>?[IlluminateContractsHashingHasher::class], ????????'translator'???????????=>?[IlluminateTranslationTranslator::class,?IlluminateContractsTranslationTranslator::class], ????????'log'??????????????????=>?[IlluminateLogWriter::class,?IlluminateContractsLoggingLog::class,?PsrLogLoggerInterface::class], ????????'mailer'???????????????=>?[IlluminateMailMailer::class,?IlluminateContractsMailMailer::class,?IlluminateContractsMailMailQueue::class], ????????'auth.password'????????=>?[IlluminateAuthPasswordsPasswordBrokerManager::class,?IlluminateContractsAuthPasswordBrokerFactory::class], ????????'auth.password.broker'?=>?[IlluminateAuthPasswordsPasswordBroker::class,?IlluminateContractsAuthPasswordBroker::class], ????????'queue'????????????????=>?[IlluminateQueueQueueManager::class,?IlluminateContractsQueueFactory::class,?IlluminateContractsQueueMonitor::class], ????????'queue.connection'?????=>?[IlluminateContractsQueueQueue::class], ????????'queue.failer'?????????=>?[IlluminateQueueFailedFailedJobProviderInterface::class], ????????'redirect'?????????????=>?[IlluminateRoutingRedirector::class], ????????'redis'????????????????=>?[IlluminateRedisRedisManager::class,?IlluminateContractsRedisFactory::class], ????????'request'??????????????=>?[IlluminateHttpRequest::class,?SymfonyComponentHttpFoundationRequest::class], ????????'router'???????????????=>?[IlluminateRoutingRouter::class,?IlluminateContractsRoutingRegistrar::class,?IlluminateContractsRoutingBindingRegistrar::class], ????????'session'??????????????=>?[IlluminateSessionSessionManager::class], ????????'session.store'????????=>?[IlluminateSessionStore::class,?IlluminateContractsSessionSession::class], ????????'url'??????????????????=>?[IlluminateRoutingUrlGenerator::class,?IlluminateContractsRoutingUrlGenerator::class], ????????'validator'????????????=>?[IlluminateValidationFactory::class,?IlluminateContractsValidationFactory::class], ????????'view'?????????????????=>?[IlluminateViewFactory::class,?IlluminateContractsViewFactory::class], ????]?as?$key?=>?$aliases)?{ ????????foreach?($aliases?as?$alias)?{ ????????????$this->alias($key,?$alias); ????????} ????} }

為alias屬性賦值

$app核心類綁定

/…/bootstrap/app.php /** ?*核心類綁定 ?*/ $app->singleton( ????IlluminateContractsHttpKernel::class, ????AppHttpKernel::class ); $app->singleton( ????IlluminateContractsConsoleKernel::class, ????AppConsoleKernel::class ); $app->singleton( ????IlluminateContractsDebugExceptionHandler::class, ????AppExceptionsHandler::class );

調用bind函數

//class?Container public?function?singleton($abstract,?$concrete?=?null) { ????$this->bind($abstract,?$concrete,?true); }

對字符串類名進行默認回調函數綁定

//class?Container public?function?bind($abstract,?$concrete?=?null,?$shared?=?false) { ????//?If?the?factory?is?not?a?Closure,?it?means?it?is?just?a?class?name?which?is ????//?bound?into?this?container?to?the?abstract?type?and?we?will?just?wrap?it ????//?up?inside?its?own?Closure?to?give?us?more?convenience?when?extending. ????if?(!?$concrete?instanceof?Closure)?{ ????????$concrete?=?$this->getClosure($abstract,?$concrete); ????} ????$this->bindings[$abstract]?=?compact('concrete',?'shared'); }

getClosure返回默認回調函數

//class?Container protected?function?getClosure($abstract,?$concrete) { ????return?function?($container,?$parameters?=?[])?use?($abstract,?$concrete)?{ ????????if?($abstract?==?$concrete)?{ ????????????return?$container->build($concrete); ????????} ????????return?$container->make($concrete,?$parameters); ????}; }

最終:返回$app

/…/bootstrap/app.php return?$app;

相關推薦:最新的五個laravel視頻教程

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享