laravel application 容器app

Posted 画地自囚工作记录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

 

 


       

 

以上是关于laravel application 容器app的主要内容,如果未能解决你的问题,请参考以下文章

laravel学习之IOC容器分析

laravel5.5源码阅读草稿——application

分析laravel的核心日志类

在 Docker 容器中使用 Laravel Mix 构建完整的 Tailwind 3 app.css 文件

Laravel:区别 App::bind 和 App::singleton

laravel的服务容器(药箱)服务提供者(小盒子)Facades(更方便用药),方便大家透彻理解