下面由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視頻教程