Laravel5.1学习笔记11 系统架构3 服务提供者
服务提供者
简介
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 register
method, 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 register
method.
所有服务提供者都继承 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 provides
method. 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 服务提供者的更多相关文章
- Laravel5.1学习笔记i14 系统架构6 Facade
Facades 介绍 使用 Facades Facade 类参考 #介绍 Facades provide a "static" interface to classes th ...
- Laravel5.1学习笔记12 系统架构4 服务容器
Service Container 介绍 绑定的用法 绑定实例到接口 上下文绑定 标签 解析 容器事件 #介绍 The Laravel service container is a powerful ...
- Laravel5.1学习笔记13 系统架构5 Contract
Contract 简介 为什么要用 Contract? Contract 参考 如何使用 Contract 简介 Laravel 中的 Contract 是一组定义了框架核心服务的接口.例如,Illu ...
- Laravel5.1学习笔记10 系统架构2 应用程序结构
应用程序结构 简介 根目录 App 目录 为应用程序设置命名空间 简介 默认的 Laravel 应用程序结构是为了给无论构建大型还是小型应用程序都提供一个良好的开始.当然,你可以依照喜好自由地组织应用 ...
- Laravel5.1学习笔记9 系统架构1 请求生命周期 (待修)
Request Lifecycle Introduction Lifecycle Overview Focus On Service Providers Introduction When using ...
- ODI学习笔记2--ODI产品架构
ODI学习笔记2--ODI产品架构 ODI产品架构: ODI提供了以下几种管理工具:Designer 用于定义数据转换逻辑,这是最常用的开发工具,大部分的开发任务,包括data store的定义,in ...
- SQL反模式学习笔记11 限定列的有效值
目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...
- 《C++ Primer Plus》学习笔记11
<C++ Primer Plus>学习笔记11 第17章 输入.输出和文件 <<<<<<<<<<<<<< ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
随机推荐
- 使用JdbcTemplate和JdbcDaoSupport
[Spring对JDBC的支持] [JDBCTemplate简介] 1.为了是JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架. 2.作为Sprin ...
- Leetcode 132.分割回文串II
分割回文串 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一次分割就可将 s ...
- CodeForces 1000F One Occurrence
You are given an array $a$ consisting of $n$ integers, and $q$ queries to it. $i$-th query is denote ...
- POJ 3101 大数+gcd
题目大意: 星星作圆周运动的周期给出,若已连成一条线,下一次所有星星在同一条线上的时间 用分数形式输出 这里我们可以利用追及问题来计算出两个星星之间连成一条直线的时间,也即速度快的星星追上速度慢的星星 ...
- swift kilo版代码更新
今天重新搭建swift服务器,git下代码后一时好奇,进入kilo/stable branch后,与四个月前下载的swift/kilo版本做了个比较.使用diff命令完成.发现代码还是略有区别. di ...
- Hihocoder 1329(splay)
Problem 平衡树 Splay 题目大意 维护一个数列,支持三种操作. 操作1:添加一个数x. 操作2:询问不超过x的最大的数. 操作三:删除大小在区间[a,b]内的数. 解题分析 和上一题相比, ...
- B. Code For 1 分治
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- - > 贪心基础入门讲解四——独木舟问题
n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人.显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟? 分析: 一个显然的策略 ...
- MyBatis 3判断不为null
<if test="type!=null and type!=''"> AND type = #{type} </if>
- Spring Boot中使用Swagger2生成RESTful API文档(转)
效果如下图所示: 添加Swagger2依赖 在pom.xml中加入Swagger2的依赖 <!-- https://mvnrepository.com/artifact/io.springfox ...