下面由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类instancesinstances: 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 Applicationprotected 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方法
//Applicationpublic 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注册提供了两种方法;
一种是字符串类名直接实例,
DeepSeek App
DeepSeek官方推出的AI对话助手App
78 查看详情
一种是执行$$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 Continerpublic function singleton($abstract, $concrete = null){ $this->bind($abstract, $concrete, true);}
调用bind方法,赋值bindings
//class Containerpublic 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 Applicationprotected function markAsRegistered($provider){ $this->serviceProviders[] = $provider; $this->loadedProviders[get_class($provider)] = true;}
LogServerProvider、RoutingServiceProvider与之类似
别名绑定
//class Applicationpublic 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 Containerpublic function singleton($abstract, $concrete = null){ $this->bind($abstract, $concrete, true);}
对字符串类名进行默认回调函数绑定
//class Containerpublic 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 Containerprotected 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.phpreturn $app;
相关推荐:最新的五个Laravel视频教程
以上就是你知道Laravel的$this->app以及app()是怎么来的吗?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/345590.html
微信扫一扫
支付宝扫一扫