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

时间: 2024-10-11 22:07:28

laravel application 容器app的相关文章

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

本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章很长,但是内容应该很有用,希望有需要的朋友能看到.php经验有限,不到位的地方,欢迎帮忙指正. 1. laravel容器基本认识 laravel框架是有一个容器框架,框架应用程序的实例就是一个超大的容器,这个实例在bootstrap/app.php内进行初始化: 这个文件在每一次请求到达laravel框架都会执行,所创建的$app即是laravel框架的应用程序实例,它在整个请求生命周期都是唯

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

本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章很长,但是内容应该很有用,希望有需要的朋友能看到.php经验有限,不到位的地方,欢迎帮忙指正. 1. laravel容器基本认识 laravel框架是有一个容器框架,框架应用程序的实例就是一个超大的容器,这个实例在bootstrap/app.php内进行初始化: 这个文件在每一次请求到达laravel框架都会执行,所创建的$app即是laravel框架的应用程序实例,它在整个请求生命周期都是唯

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

本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章很长,但是内容应该很有用,希望有需要的朋友能看到.php经验有限,不到位的地方,欢迎帮忙指正. 1. laravel容器基本认识 laravel框架是有一个容器框架,框架应用程序的实例就是一个超大的容器,这个实例在bootstrap/app.php内进行初始化: 这个文件在每一次请求到达laravel框架都会执行,所创建的$app即是laravel框架的应用程序实例,它在整个请求生命周期都是唯

laravel 服务容器实现原理

前言 通过实现laravel 框架功能,以便深入理解laravel框架的先进思想. 什么是服务容器 服务容器是用来管理类依赖与运行依赖注入的工具.Laravel框架中就是使用服务容器来实现 ** 控制反转 ** 和 ** 依赖注入 **. 什么是控制反转(IoC)和依赖注入(DI) 控制反转(IoC) 就是说把创建对象的** 控制权 进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,也就是 Laravel ** 中的容器. 依赖注入(DI)则是帮助容器实现在运行

Laravel 服务容器 IoC(控制反转) 和 DI(依赖注入)

Laravel 服务容器 IoC(控制反转) 和 DI(依赖注入) IoC 容器, laravel 的核心 Laravel 的核心就是一个 IoC 容器,根据文档,称其为“服务容器”,顾名思义,该容器提供了整个框架中需要的一系列服务.作为初学者,很多人会在这一个概念上犯难,因此,我打算从一些基础的内容开始讲解,通过理解面向对象开发中依赖的产生和解决方法,来逐渐揭开“依赖注入”的面纱,逐渐理解这一神奇的设计理念. 本文一大半内容都是通过举例来让读者去理解什么是 IoC(控制反转) 和 DI(依赖注

[转载]Laravel Container (容器) 深入理解 (下)

本文大部分翻译自 DAVE JAMES MILLER 的 <Laravel's Dependency Injection Container in Depth> . 上文介绍了 Dependency Injection Containers (容器) 的基本概念,现在接着深入讲解 Laravel 的 Container. Laravel 中实现的 Inversion of Control (IoC) / Dependency Injection (DI) Container 非常强悍,但文档中

laravel服务容器

\public\index.php 1 <?php 2 define('LARAVEL_START', microtime(true)); 3 //注册自动加载文件 4 require __DIR__.'/../vendor/autoload.php'; 5 /** 6 * 服务容器的生成 7 * 主要实现了服务容器的实例化和基本注册 8 *包括服务容器本身的注册,基础服务提供者注册,核心类别名注册和基本路径注册 9 * 10 */ 11 $app = require_once __DIR__.

理解 PHP 依赖注入 | Laravel IoC容器

Laravel框架的依赖注入确实很强大,并且通过容器实现依赖注入可以有选择性的加载需要的服务,提高初始化框架的开销,下面是我在网上看到的一个帖子,写的很好拿来与大家分享,文章从开始按照传统的类设计数据库连接一直到通过容器加载服务这个高度解耦的设计展示了依赖注入的强大之处,值得我们借鉴和学习. -----------------------------------------------------------分割线下面是大牛的原文---------------------------------

理解PHP 依赖注入|Laravel IoC容器

看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了,现在确实很懒变得! 首先,我们假设,我们要开发一个组件命名为SomeComponent.这个组件中现在将要注入一个数据库连接. 在这个例子中,数据库连接在component中被创建,这种方法是不切实际的,这样做的话,我们将不能改变数据库连接参数及数据库类型等一些参数. 01 <?php 02   0