laravel application 容器app
vendor/laravel/framework/src/Illuminate/Foundation/Application.php
Application是laravel的核心容器,几乎处理所有东西的时候都需要用到,主要功能有:
1. app首先继承了container,作为一个容器类存在
2。注册了laravel运行过程的需要的基础类进容器,并且生成了运行需要的实例。承担了初始化功能。
这里需要额外说一下,app里面说的所谓注册,不是指绑定,应该是直接直接实例化了,并注入到容器。但是,针对provider,实例化了provider,并运行了,并不会生成实际的类,而是将类绑定。
3. 额外提供了更方便的一些功能,主要是与程序的环境相关的,比如:provider处理运行是在这里,config app里面的配置就在本类读取并处理。
具体功能如下:
1. container的功能就不说了,前面微博已经描述这个了。
2. 注册程序运行中需要的最基础的类
在 __construct:构造函数中处理:
if ($basePath) {
$this->setBasePath($basePath);
}
$this->registerBaseBindings();
$this->registerBaseServiceProviders();
$this->registerCoreContainerAliases();
setBasePath 基本路径添加进容器实例,这也是这绝大多数框架里面都需要做都事情,防止出现相对绝对等各种路径使用时候的混乱,总共添加了这么多:
$this->instance('path', $this->path());
$this->instance('path.base', $this->basePath());
$this->instance('path.lang', $this->langPath());
$this->instance('path.config', $this->configPath());
$this->instance('path.public', $this->publicPath());
$this->instance('path.storage', $this->storagePath());
$this->instance('path.database', $this->databasePath());
$this->instance('path.resources', $this->resourcePath());
$this->instance('path.bootstrap', $this->bootstrapPath());
registerBaseBindings
注册基本绑定,添加app本身进容器实例,然后,PackageManifest添加进容器实例,本功能可以处理一些默认的provider和aliases,本功能后续展开描述。
registerBaseServiceProviders
注册基本的Providers,包括event/log/router 这三部分
event:vendor/laravel/framework/src/Illuminate/Events/EventServiceProvider.php
log:vendor/laravel/framework/src/Illuminate/Log/LogServiceProvider.php
router:vendor/laravel/framework/src/Illuminate/Routing/RoutingServiceProvider.php
router的provider跟别的不一样,提供了多个相关绑定:router url redirect Psr\Http\Message\ServerRequestInterface Psr\Http\Message\ResponseInterface Illuminate\Contracts\Routing\ResponseFactory Illuminate\Routing\Contracts\ControllerDispatcher
registerCoreContainerAliases 注册一些核心的别名,包括:
'app' => [\Illuminate\Foundation\Application::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],
所以,初始化之后的app里面的内容如下:
bindings 里面有如下内容:
events
log
router
url
redirect
Psr\Http\Message\ServerRequestInterface
Psr\Http\Message\ResponseInterface
Illuminate\Contracts\Routing\ResponseFactory
Illuminate\Routing\Contracts\ControllerDispatcher
总结一下,application初始化的时候,就干了这么几个事情:
1. 定位自己,确定文件运行的相关目录
2. 把自己扔进容器,把用来引用其他代码的package类实例化进容器。
3. log/event/router 三大基本功能提高provider
4. 绑定别名,当然,许多别名,这这个时候,实际上是无效的。因为根本没绑定到实际类,估计是为了占空。
在container之外扩展的功能:
1. 启动时额外提供的初始化功能,并且添加了相关事件的注册,主要函数bootstrapWith。
添加事件 bootstrapping bootstrapped 并且注册外面类提供的所有初始化功能。准备程序运行的参数和环境的注入。
2. registerConfiguredProviders 函数,读取app.providers里面定义的provider,并注册。
3. provider的处理,主要函数,register(注册provider),boot等。
4. 延迟加载deferredServices,延迟加载的provider,只是注册进container,但是,并不实例化provider,只有调用相关类的时候,才会运行provider进行注册。
5.handle 直接调用kernel处理request,也是针对网络访问的一个出口函数。
app在container之外,添加了provider的概念,添加了request相关处理的概念,将container包装成了一个处理网络请求的新container。
instances里面有如下内容:
path::/Users/yuxuezhong/git/webservice/api/app
path.base::/Users/yuxuezhong/git/webservice/api
path.lang::/Users/yuxuezhong/git/webservice/api/resources/lang
path.config::/Users/yuxuezhong/git/webservice/api/config
path.public::/Users/yuxuezhong/git/webservice/api/public
path.storage::/Users/yuxuezhong/git/webservice/api/storage
path.database::/Users/yuxuezhong/git/webservice/api/database
path.resources::/Users/yuxuezhong/git/webservice/api/resources
path.bootstrap::/Users/yuxuezhong/git/webservice/api/bootstrap
app::Illuminate\Foundation\Application
Illuminate\Container\Container::Illuminate\Foundation\Application
Illuminate\Foundation\PackageManifest::Illuminate\Foundation\PackageManifest