下面由laravel教程栏目给大家介绍laravel的$this->app以及app()是怎么来的,希望对需要的朋友有所帮助!
断点调试寻找对应文件,忽略次要步骤,仅描述核心动作,‘/’表示index.php所在目录
地址:index.php
$app = require_once __dir__.'/../bootstrap/app.php';
$app初始化
路径/…/bootstrap/app.php
$app = new illuminate\foundation\application( 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” => “\var\www\app”“path.base” => “\var\www”“path.lang” => “\var\www\resources\lang”“path.config” => “\var\www\config”“path.public” => “\var\www\public”“path.storage” => “\var\www\storage”“path.database” => “\var\www\database”“path.resources” => “\var\www\resources”“path.bootstrap” => “\var\www\bootstrap”]
基础绑定
向container的instances中添加绑定
"app" => application {#2} "illuminate\container\container" => application {#2} "illuminate\foundation\packagemanifest" => packagemanifest {#4 ▼ +files: filesystem {#5} +basepath: "\var\www" +vendorpath: "\var\www\vendor" +manifestpath: "\var\www\bootstrap\cache\packages.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注册提供了两种方法;
一种是字符串类名直接实例,
一种是执行$$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, \illuminate\contracts\container\container::class, \illuminate\contracts\foundation\application::class, \psr\container\containerinterface::class], 'auth' => [\illuminate\auth\authmanager::class, \illuminate\contracts\auth\factory::class], 'auth.driver' => [\illuminate\contracts\auth\guard::class], 'blade.compiler' => [\illuminate\view\compilers\bladecompiler::class], 'cache' => [\illuminate\cache\cachemanager::class, \illuminate\contracts\cache\factory::class], 'cache.store' => [\illuminate\cache\repository::class, \illuminate\contracts\cache\repository::class], 'config' => [\illuminate\config\repository::class, \illuminate\contracts\config\repository::class], 'cookie' => [\illuminate\cookie\cookiejar::class, \illuminate\contracts\cookie\factory::class, \illuminate\contracts\cookie\queueingfactory::class], 'encrypter' => [\illuminate\encryption\encrypter::class, \illuminate\contracts\encryption\encrypter::class], 'db' => [\illuminate\database\databasemanager::class], 'db.connection' => [\illuminate\database\connection::class, \illuminate\database\connectioninterface::class], 'events' => [\illuminate\events\dispatcher::class, \illuminate\contracts\events\dispatcher::class], 'files' => [\illuminate\filesystem\filesystem::class], 'filesystem' => [\illuminate\filesystem\filesystemmanager::class, \illuminate\contracts\filesystem\factory::class], 'filesystem.disk' => [\illuminate\contracts\filesystem\filesystem::class], 'filesystem.cloud' => [\illuminate\contracts\filesystem\cloud::class], 'hash' => [\illuminate\contracts\hashing\hasher::class], 'translator' => [\illuminate\translation\translator::class, \illuminate\contracts\translation\translator::class], 'log' => [\illuminate\log\writer::class, \illuminate\contracts\logging\log::class, \psr\log\loggerinterface::class], 'mailer' => [\illuminate\mail\mailer::class, \illuminate\contracts\mail\mailer::class, \illuminate\contracts\mail\mailqueue::class], 'auth.password' => [\illuminate\auth\passwords\passwordbrokermanager::class, \illuminate\contracts\auth\passwordbrokerfactory::class], 'auth.password.broker' => [\illuminate\auth\passwords\passwordbroker::class, \illuminate\contracts\auth\passwordbroker::class], 'queue' => [\illuminate\queue\queuemanager::class, \illuminate\contracts\queue\factory::class, \illuminate\contracts\queue\monitor::class], 'queue.connection' => [\illuminate\contracts\queue\queue::class], 'queue.failer' => [\illuminate\queue\failed\failedjobproviderinterface::class], 'redirect' => [\illuminate\routing\redirector::class], 'redis' => [\illuminate\redis\redismanager::class, \illuminate\contracts\redis\factory::class], 'request' => [\illuminate\http\request::class, \symfony\component\httpfoundation\request::class], 'router' => [\illuminate\routing\router::class, \illuminate\contracts\routing\registrar::class, \illuminate\contracts\routing\bindingregistrar::class], 'session' => [\illuminate\session\sessionmanager::class], 'session.store' => [\illuminate\session\store::class, \illuminate\contracts\session\session::class], 'url' => [\illuminate\routing\urlgenerator::class, \illuminate\contracts\routing\urlgenerator::class], 'validator' => [\illuminate\validation\factory::class, \illuminate\contracts\validation\factory::class], 'view' => [\illuminate\view\factory::class, \illuminate\contracts\view\factory::class], ] as $key => $aliases) { foreach ($aliases as $alias) { $this->alias($key, $alias); } }}
为alias属性赋值
$app核心类绑定
/…/bootstrap/app.php/** *核心类绑定 */$app->singleton( illuminate\contracts\http\kernel::class, app\http\kernel::class);$app->singleton( illuminate\contracts\console\kernel::class, app\console\kernel::class);$app->singleton( illuminate\contracts\debug\exceptionhandler::class, app\exceptions\handler::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()是怎么来的吗?的详细内容。