肯定是看不懂的,所以只是自己拿来做个笔记的。
Laravel 服务容器启动流程
index.php
//$app就是服务容器,这里应该是运行了该 app.php 的代码,并将返回结果传递到$app中
$app = require_once __DIR__.'/../bootstrap/app.php';
//获取 Illuminate\Contracts\Http\Kernel::class 类实例
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
//调用该类的 handle 方法处理来自用户的请求
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
app.php
/**
* 创建服务容器
*/
$app = new Illuminate\Foundation\Application(
//返回绝对路径
realpath(__DIR__.'/../')
);
/**
* singleton()单独绑定类,第二个实体类可以为空,如果第二个参数不为空的话,则正常进行绑定
*/
$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
);
return $app;
Application.php
上面虽然只是实例化了Application
以及调用了singleton
函数,但是实际上Application.php
类的实例化中也有运行很多内容:
public function __construct($basePath = null)
{
if ($basePath) {
$this->setBasePath($basePath);
}
// 注册基础类
$this->registerBaseBindings();
// 注册基础的服务提供者
$this->registerBaseServiceProviders();
// 注册核心类的别名
$this->registerCoreContainerAliases();
}
其中,registerBaseBindings
函数如下:
protected function registerBaseBindings()
{
// 将自身类保存在父级的$Instance数组中,该数组保存各种服务提供者的实例
static::setInstance($this);
// 将该类绑定到'app'上
$this->instance('app', $this);
// 现在这个类依赖于Container类,这里使用服务容器类进行自动绑定
$this->instance(Container::class, $this);
}
protected function registerBaseServiceProviders()
{
//注册该服务提供者,并依次调用其中的register方法和boot方法
$this->register(new EventServiceProvider($this));
$this->register(new LogServiceProvider($this));
$this->register(new RoutingServiceProvider($this));
}
// register函数
public function register($provider, $options = [], $force = false)
{
//该函数解析暂定
if (($registered = $this->getProvider($provider)) && ! $force) {
return $registered;
}
//如果参数是一个字符串的话就返回该类的实例 new $provider
if (is_string($provider)) {
$provider = $this->resolveProvider($provider);
}
//如果在该类中有register方法的话,那就调用该方法
if (method_exists($provider, 'register')) {
$provider->register();
}
//将该类标记为已注册过的类
$this->markAsRegistered($provider);
/**
* 如果该服务提供类已经启动了,则会调用该类的boot方法
*/
if ($this->booted) {
//这个函数就是调用该服务提供者的boot()方法的
$this->bootProvider($provider);
}
return $provider;
}
//注册别名函数
public function registerCoreContainerAliases()
{
$aliases = [
'app' => [\Illuminate\Foundation\Application::class, \Illuminate\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::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],
];
foreach ($aliases as $key => $aliases) {
foreach ($aliases as $alias) {
$this->alias($key, $alias);
}
}
}
public function alias($abstract, $alias)
{
$this->aliases[$alias] = $abstract;
$this->abstractAliases[$abstract][] = $alias;
}