Laravel 服务容器启动流程(就是做个摘记,我也还很迷糊中)

33 篇文章 0 订阅

肯定是看不懂的,所以只是自己拿来做个笔记的。

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;
    }    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值