服务提供者

简介

Service providers are the central place of all Laravel application bootstrapping. Your own application, as well as all of Laravel's core services are bootstrapped via service providers.

服务提供者是所有Laravel应用程序的启动中心, 你的应用程序,和所有Laravel的核心服务,都通过服务提供者来启动。

But, what do we mean by "bootstrapped"? In general, we mean registering things, including registering service container bindings, event listeners, middleware, and even routes. Service providers are the central place to configure your application.

但是我们说的“启动”?一般而言,我们是指注册事物, 包括注册服务容器绑定, 事件监听器,中间件甚至路由, 服务提供者是你应用程序配置中心所在。

 

If you open the config/app.php file included with Laravel, you will see a providers array. These are all of the service provider classes that will be loaded for your application. Of course, many of them are "deferred" providers, meaning they will not be loaded on every request, but only when the services they provide are actually needed.

如果你打开包含于Laravel中的 config/app.php 这一文件, 你会看到providers数组, 他们是所有将要加载到你的应用程序的服务提供者类。 当然,他们之中有很多属于“缓载”提供者, 意思是除非真正需要他们所提供的服务, 否则它们并不在每个请求中都被加载。

In this overview you will learn how to write your own service providers and register them with your Laravel application.

这份概述中,你将会学到如何编写你自己的服务提供者, 并把他们注册于你的Laravel应用程序。

#编写服务提供者

All service providers extend the Illuminate\Support\ServiceProvider class. This abstract class requires that you define at least one method on your provider: register. Within the registermethod, you should only bind things into the service container. You should never attempt to register any event listeners, routes, or any other piece of functionality within the registermethod.

所有服务提供者都继承 Illuminate\Support\ServiceProvider  类, 这个抽象类要求你至少实现一个register 方法, 在这个 register方法中, 你应该只绑定到服务容器里的东西, 你不应该尝试注册任何事件监听器, 路由,和其他功能。

The Artisan CLI can easily generate a new provider via the make:provider command:

Artisan CLI 很容易通过 make: provider命令 生成一个新的服务提供者

php artisan make:provider RiakServiceProvider

Register方法

As mentioned previously, within the register method, you should only bind things into theservice container. You should never attempt to register any event listeners, routes, or any other piece of functionality within the register method. Otherwise, you may accidently use a service that is provided by a service provider which has not loaded yet.

Now, let's take a look at a basic service provider:

就像前面提到过的, 在register 方法里, 你只绑定到服务容器之中, , 你绝不应该视图注册任何的事件监听器,路由,和其他功能, 否则,你可能意外的使用的一个服务提供者提供的服务,而这个服务还没有被加载。

<?php

namespace App\Providers;

use Riak\Connection;
use Illuminate\Support\ServiceProvider; class RiakServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function register()
{
$this->app->singleton('Riak\Contracts\Connection', function ($app) {
return new Connection(config('riak'));
});
}
}

This service provider only defines a register method, and uses that method to define an implementation of Riak\Contracts\Connection in the service container. If you don't understand how the service container works, check out its documentation.

这个务提供者定义了一个register方法,是用这个方法在服务容器中定义了一个Riak\Contracts\Connection 的实现, 如果你不懂服务容器的工作原理,我们很快就会提到

启动方法 Boot Method

So, what if we need to register a view composer within our service provider? This should be done within the boot method. This method is called after all other service providers have been registered, meaning you have access to all other services that have been registered by the framework:

那么,我们需要注册一个view composer 在我们服务提供者,该怎么做,这就要在boot方法中写, 这个方法会在所有服务提供者注册后被调用,这能让你取得所有其他已经注册的服务。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
view()->composer('view', function () {
//
});
} /**
* Register bindings in the container.
*
* @return void
*/
public function register()
{
//
}
}

启动方法依赖注入

We are able to type-hint dependencies for our boot method. The service container will automatically inject any dependencies you need:

我们能够类型提示 boot方法的依赖, 服务容器将会自动注入任何的需要的依赖。

use Illuminate\Contracts\Routing\ResponseFactory;

public function boot(ResponseFactory $factory)
{
$factory->macro('caps', function ($value) {
//
});
}

#注册提供者

All service providers are registered in the config/app.php configuration file. This file contains a providers array where you can list the names of your service providers. By default, a set of Laravel core service providers are listed in this array. These providers bootstrap the core Laravel components, such as the mailer, queue, cache, and others.

所有的服务提供者都在 config/app.php 配置文件中被注册。 此文件包含了一个providers 数组, 你可以在其中列出所有服务提供者的名称。 此数组会默认列出一组Laravel核心服务提供者, 这些提供者启动了Laravel的核心组件, 例如邮件发送者,队列,缓存及其他等等。

To register your provider, simply add it to the array:

要注册你的提供者,只要把它加入次数组。

'providers' => [
// Other Service Providers 'App\Providers\AppServiceProvider',
],

#缓载提供者

If your provider is only registering bindings in the service container, you may choose to defer its registration until one of the registered bindings is actually needed. Deferring the loading of such a provider will improve the performance of your application, since it is not loaded from the filesystem on every request.

若你的提供者仅仅用于绑定注册到服务容器, 你可以选择延缓其注册, 知道真正需要其中注册的绑定才加载。 延缓像这样的一个提供者加载可以增进应用程序的性能,因为这样就不用每个请求都从文件系统中将其加载。

To defer the loading of a provider, set the defer property to true and define a providesmethod. The provides method returns the service container bindings that the provider registers:

要延缓提供者加载,将defer性质设为true, 并定义一个provides方法。 provides方法应返回提供者所注册的服务容器绑定。

<?php

namespace App\Providers;

use Riak\Connection;
use Illuminate\Support\ServiceProvider; class RiakServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = true; /**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->singleton('Riak\Contracts\Connection', function ($app) {
return new Connection($app['config']['riak']);
});
} /**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return ['Riak\Contracts\Connection'];
} }

Laravel compiles and stores a list of all of the services supplied by deferred service providers, along with the name of its service provider class. Then, only when you attempt to resolve one of these services does Laravel load the service provider.

Laravel 编译并保存所有由延缓服务提供者所提供的服务清单, 以及其服务者的类名称。 只有在当你尝试解析其中的服务时,Laravel才会加载服务提供者。

Laravel5.1学习笔记11 系统架构3 服务提供者的更多相关文章

  1. Laravel5.1学习笔记i14 系统架构6 Facade

    Facades 介绍  使用 Facades Facade 类参考   #介绍 Facades provide a "static" interface to classes th ...

  2. Laravel5.1学习笔记12 系统架构4 服务容器

    Service Container 介绍 绑定的用法  绑定实例到接口 上下文绑定 标签 解析 容器事件 #介绍 The Laravel service container is a powerful ...

  3. Laravel5.1学习笔记13 系统架构5 Contract

    Contract 简介 为什么要用 Contract? Contract 参考 如何使用 Contract 简介 Laravel 中的 Contract 是一组定义了框架核心服务的接口.例如,Illu ...

  4. Laravel5.1学习笔记10 系统架构2 应用程序结构

    应用程序结构 简介 根目录 App 目录 为应用程序设置命名空间 简介 默认的 Laravel 应用程序结构是为了给无论构建大型还是小型应用程序都提供一个良好的开始.当然,你可以依照喜好自由地组织应用 ...

  5. Laravel5.1学习笔记9 系统架构1 请求生命周期 (待修)

    Request Lifecycle Introduction Lifecycle Overview Focus On Service Providers Introduction When using ...

  6. ODI学习笔记2--ODI产品架构

    ODI学习笔记2--ODI产品架构 ODI产品架构: ODI提供了以下几种管理工具:Designer 用于定义数据转换逻辑,这是最常用的开发工具,大部分的开发任务,包括data store的定义,in ...

  7. SQL反模式学习笔记11 限定列的有效值

    目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...

  8. 《C++ Primer Plus》学习笔记11

    <C++ Primer Plus>学习笔记11 第17章 输入.输出和文件 <<<<<<<<<<<<<< ...

  9. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

随机推荐

  1. 管理Bean的生命周期

    [IOC容器中Bean的生命周期方法] 1.SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务. 2.Spring IOC容器对Bean的生命周 ...

  2. mySQL and sqoop for ubuntu

    数据的导入导出 ——MySQL & sqoop in Ubuntu 1.完成搭建hadoop集群 2.安装MySQL sudo apt-get install mysql-server mys ...

  3. UVA 12686 Trending Topic

    Trending Topic Time limit: 1.000 seconds Imagine you are in the hiring process for a company whose p ...

  4. Linux & Filesystem Hierarchy Standard

    Linux & Filesystem Hierarchy Standard The Filesystem Hierarchy Standard of Linux https://zhuanla ...

  5. BZOJ3991 寻宝游戏 LCA 虚树 SET

    5.26 T1:寻宝游戏 Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄, ...

  6. python实现汉诺塔算法

    汉诺塔 算法分析 1.步骤1:如果是一个盘子,直接将a柱子上的盘子从a移动到c 否则 2.步骤2:先将A柱子上的n-1个盘子借助C移动到B(图1) 已知函数形参为hanoi(n,a,b,c),这里调用 ...

  7. Ubuntu 16.04设置文件夹试图永久以列表显示

    图片来自:http://forum.ubuntu.org.cn/viewtopic.php?p=2043385

  8. Ubuntu 16.04下FireFox安装Flash插件

    下载: https://get.adobe.com/flashplayer/ 选择tar.gz包 解压 sudo tar zxvf flash_player_npapi_linux.x86_64.ta ...

  9. 演练:使用VS2010 C# 创作简单的多线程组件

    BackgroundWorker 组件取代了 System.Threading 命名空间并添加了功能:但是,可以选择保留 System.Threading 命名空间以实现向后兼容并供将来使用.有关更多 ...

  10. 【翻译自mos文章】rman 标准版和企业版的兼容性

    rman 标准版和企业版的兼容性 来源于: RMAN Standard and Enterprise Edition Compatibility (文档 ID 730193.1) 适用于: Oracl ...