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的更多相关文章

  1. [php]laravel框架容器管理的一些要点

    本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章很长,但是内容应该很有用,希望有需要的朋友能看到.php经验有限,不到位的地方,欢迎帮忙指正. ...

  2. laravel框架容器管理

    来自http://www.cnblogs.com/chy1000/p/7072936.html 本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章 ...

  3. laravel框架容器管理的一些要点

    本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章很长,但是内容应该很有用,希望有需要的朋友能看到.php经验有限,不到位的地方,欢迎帮忙指正. ...

  4. laravel框架容器管理的一些要点(转)

    本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章很长,但是内容应该很有用,希望有需要的朋友能看到.php经验有限,不到位的地方,欢迎帮忙指正. ...

  5. Laravel服务容器的绑定与解析

    本篇文章给大家带来的内容是关于Laravel服务容器的绑定与解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言   老实说,第一次老大让我看laravel框架手册的那天早上,我 ...

  6. laravel 服务容器实现原理

    前言 通过实现laravel 框架功能,以便深入理解laravel框架的先进思想. 什么是服务容器 服务容器是用来管理类依赖与运行依赖注入的工具.Laravel框架中就是使用服务容器来实现 ** 控制 ...

  7. Laravel 服务容器、服务提供器、契约实例讲解

        前言 刚开始看laravel服务容器.契约.服务提供器的确生涩难懂,不单单是概念繁多,而且实际的demo很难找(找是找到了,但难用啊),最后就隔一段时间看一遍,大概个十来遍,还真给看出个门道, ...

  8. laravel服务容器

    laravel框架底层解析 本文参考陈昊<Laravel框架关键技术解析>,搭建一个属于自己的简化版服务容器.其中涉及到反射.自动加载,还是需要去了解一下. laravel服务容器 建立项 ...

  9. 关于使用 Laravel 服务容器的优势介绍

    如果说laravel框架的核心是什么,那么无疑是服务容器.理解服务容器的概念,对于我们使用laravel太重要了,应该说是否理解服务容器的概念是区分是否入门laravel的重要条件.因为整个框架正是在 ...

随机推荐

  1. Android代码编译环境配置 “Gerrit和Git环境配置”

    Gerrit和Git环境配置可以参考<git&gerrit操作指导> 步骤1. 先在Gerrit中创建新的账户: 步骤2. 在新的客户端上生成密钥(可以使用的是生成的公钥): 步骤 ...

  2. es6学习笔记-Symbol

    概述 ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种机制 ...

  3. Hadoop Java API 操作 hdfs--1

    Hadoop文件系统是一个抽象的概念,hdfs仅仅是Hadoop文件系统的其中之一. 就hdfs而言,访问该文件系统有两种方式:(1)利用hdfs自带的命令行方式,此方法类似linux下面的shell ...

  4. [LeetCode] Smallest Rotation with Highest Score 得到最高分的最小旋转

    Given an array A, we may rotate it by a non-negative integer K so that the array becomes A[K], A[K+1 ...

  5. /var/spool/clientmqueue目录~清理

    今天nagios报警,一台服务器的disk满了,使用du -sh * 或 du -sh /* 查看目录的大小,查找占用空间大的目录/var/spool/clientmqueue.... 然后我就想/v ...

  6. Jmeter应用-接口测试

    1.BS架构应用性能 2.HTTP协议接口功能与性能 3.FTP协议接口功能与性能 4.Mysql数据库性能 5.MongoDB数据库性能 6.支持自定义Java组件开发 测试计划-右键-添加线程组 ...

  7. gvim 技巧

    1.对齐 很多时候想对齐括号和“=”号,行数很多的时候就是体力活了.使用3条命令就可以完成对齐 :set ts=16                    ##将tab设置为16 :%s/(/\t(/ ...

  8. | 线段树-地平线horizon

    [题目描述]:在地平线上有n个建筑物.每个建筑物在地平线上可以看成一个下边界和地平线重合的矩形.每个建筑物有三个描述(Li ,Ri,Hi),分别表示该建筑物的左边界,右边界,高度.输出输出这些建筑物在 ...

  9. js canvas游戏初级demo-躲避障碍物

    在线演示地址 http://200ok.fun:3100/html/game_demo.html 继上次js canvas游戏初级demo-上下左右移动(https://www.cnblogs.com ...

  10. delphi调用windows自带语音功能

    windows自带语音接口 SAPI.SpVoice, 接口说明如下 https://docs.microsoft.com/en-us/previous-versions/windows/deskto ...