服务提供者 | 核心架构 |《Laravel 5.8 中文文档 5.8》| Laravel China 社区


本站和网页 https://learnku.com/docs/laravel/5.8/providers/3887 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

服务提供者 | 核心架构 |《Laravel 5.8 中文文档 5.8》| Laravel China 社区
Laravel
话题列表
社区 Wiki
优质外文
招聘求职
Laravel 实战教程
社区文档
登录
注册
Laravel 5.8 中文文档
展开或关闭
前言
发行说明
升级说明
贡献导引
入门指南
安装
配置信息
文件夹结构
Homestead
Valet
部署
核心架构
请求周期
服务容器
服务提供者
Facades
Contracts
基础功能
路由
中间件
CSRF 保护
控制器
请求
响应
视图
URL
Session
表单验证
错误
日志
前端开发
Blade 模板
本地化
前端指南
编译资源 Mix
安全相关
用户认证
API 认证
用户授权
Email 认证
加密解密
哈希
重置密码
综合话题
Artisan 命令行
广播系统
缓存系统
集合
事件系统
文件存储
辅助函数
邮件发送
消息通知
扩展包开发
队列
任务调度
数据库
快速入门
查询构造器
分页
数据库迁移
数据填充
Redis
Eloquent ORM
快速入门
模型关联
Eloquent 集合
修改器
API 资源
序列化
测试相关
快速入门
HTTP 测试
命令行测试
数据库测试
测试模拟器 Mocking
官方扩展包
Cashier 交易工具包
浏览器测试 Dusk
Envoy 部署工具
Horizon 队列管理工具
Passport OAuth 认证
Scout 全文搜索
Socialite 社会化登录
Telescope 应用调试工具
Laravel
首页
Laravel
Go
PHP
Vue.js
Python
Java
MySQL
Rust
LK
Elasticsearch
F2E 前端
Server
程序员
Database
DevTools
Computer Science
手机开发
AdonisJS
社区
Wiki
教程
Laravel 实战教程首页
《L01 Laravel 教程 - Web 开发实战入门》
《L02 Laravel 教程 - Web 开发实战进阶》
《L03 Laravel 教程 - 实战构架 API 服务器》
《L04 Laravel 教程 - 微信小程序从零到发布》
《L05 Laravel 教程 - 电商实战》
《L06 Laravel 教程 - 电商进阶》
《LX1 Laravel / PHP 扩展包视频教程》
《LX2 PHP 扩展包实战教程 - 从入门到发布》
《L07 Laravel 教程 - Laravel TDD 测试实战》
《LX3 Laravel 性能优化入门》
《LX4 Laravel / PHP 五分钟视频》
文档
社区文档首页
《Laravel 中文文档》
《Laravel 速查表》
《PHP 代码简洁之道》
《Laravel 编码技巧》
《Dcat Admin 中文文档》
《Laravel Nova 中文文档》
《Lumen 中文文档》
《Dingo API 中文文档》
《 Laravel 项目开发规范》
《构建 Laravel 开发环境》
登录
注册
微信登录
提交改进
服务提供者
5.8
9.x
8.5
8.x
7.x
6.x
5.8
5.7
5.6
5.5
5.4
5.3
5.2
5.1
Laravel 5.8 中文文档
未匹配的标注
本文档最新版为 9.x,旧版本可能放弃维护,推荐阅读最新版!
服务提供者
简介编写服务提供者
注册方法引导方法
注册提供者延迟提供者
简介
服务提供者是所有 Laravel 应用程序的引导中心。你的应用程序,以及 通过服务器引导的 Laravel 核心服务都是通过服务提供器引导。
但是,「引导」是什么意思呢? 通常,我们的可以理解为注册,比如注册服务容器绑定,事件监听器,中间件,甚至是路由。服务提供者是配置应用程序的中心。
当你打开 Laravel 的 config/app.php 文件时,你会看到 providers 数组。数组中的内容是应用程序要加载的所有服务提供者的类。当然,其中有很多 「延迟」 提供者,他们并不会在每次请求的时候都加载,只有他们的服务实际被需要时才会加载。
本篇你将会学到如何编写自己的服务提供者,并将其注册到你的 Laravel 应用程序中
编写服务提供者
所有的服务提供者都会继承 Illuminate\Support\ServiceProvider 类。 大多服务提供者都包含一个 register 和一个boot 方法。在 register 方法中, 你只需要将事物绑定到服务容器。而不要尝试在 register 方法中注册任何监听器,路由,或者其他任何功能
使用 Artisan 命令行工具,通过 make:provider 命令可以生成一个新的提供者:
php artisan make:provider RiakServiceProvider
注册方法
如上所述,在 register 方法中,你只需要将服务绑定到服务容器中。而不要尝试在 register 方法中注册任何监听器,路由,或者其他任何功能。否则,你可能会意外地使用到尚未加载的服务提供者提供的服务。
让我们来看一个基础的服务提供者。在任何服务提供者方法中,你总是通过 $app 属性来访问服务容器:
<?php
namespace App\Providers;
use Riak\Connection;
use Illuminate\Support\ServiceProvider;
class RiakServiceProvider extends ServiceProvider
/**
* 在服务容器里注册
* @return void
*/
public function register()
$this->app->singleton(Connection::class, function ($app) {
return new Connection(config('riak'));
});
这个服务提供者只是定义了一个 register 方法,并且使用这个方法在服务容器中定义了一个 Riak\Connection 接口。如果你不理解服务容器的工作原理,请查看其文档。
bindings 和 singletons 的特性
如果你的服务提供器注册了许多简单的绑定,你可能想用 bindings 和 singletons 属性替代手动注册每个容器绑定。当服务提供器被框架加载时,将自动检查这些属性并注册相应的绑定
<?php
namespace App\Providers;
use App\Contracts\ServerProvider;
use App\Contracts\DowntimeNotifier;
use Illuminate\Support\ServiceProvider;
use App\Services\PingdomDowntimeNotifier;
use App\Services\DigitalOceanServerProvider;
class AppServiceProvider extends ServiceProvider
/**
* 设定所有的容器绑定的对应关系
* @var array
*/
public $bindings = [
ServerProvider::class => DigitalOceanServerProvider::class,
];
/**
* 设定所有的单例模式容器绑定的对应关系
* @var array
*/
public $singletons = [
DowntimeNotifier::class => PingdomDowntimeNotifier::class,
];
引导方法
如果我们要在服务提供者中注册一个 视图合成器 该怎么做? 这就需要用到 boot 方法了。 该方法在所有服务提供者被注册以后才会被调用, 这就是说我们可以在其中访问框架已注册的所有其它服务:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
/**
* 启动所有的应用服务。
* @return void
*/
public function boot()
view()->composer('view', function () {
//
});
启动方法的依赖注入
你可以为服务提供者的 boot 方法设置类型提示。 服务容器 会自动注入你所需要的依赖:
use Illuminate\Contracts\Routing\ResponseFactory;
public function boot(ResponseFactory $response)
$response->macro('caps', function ($value) {
//
});
注册服务提供者
所有服务提供者都是通过配置文件 config/app.php 进行注册。该文件包含了一个列出所有服务提供者名字的 providers 数组,默认情况下,其中列出了所有核心服务提供者,这些服务提供者启动 Laravel 核心组件,比如邮件、队列、缓存等等。
要注册提供器,只需要将其添加到数组:
'providers' => [
// 其他服务提供者
App\Providers\ComposerServiceProvider::class,
],
延迟提供者
如果你的服务提供者 只 在 服务容器 中注册,可以选择延迟加载该绑定直到注册绑定的服务真的需要时再加载,延迟加载这样的一个提供者将会提升应用的性能,因为它不会在每次请求时都从文件系统加载。
Laravel 编译并保存延迟服务提供者提供的所有服务的列表,以及其服务提供者类的名称。因此,只有当你在尝试解析其中一项服务时,Laravel 才会加载服务提供者。
要延迟加载提供者,需要实现 \Illuminate\Contracts\Support\DeferrableProvider 接口并置一个 provides 方法。这个 provides 方法返回该提供者注册的服务容器绑定:
<?php
namespace App\Providers;
use Riak\Connection;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Support\DeferrableProvider;
class RiakServiceProvider extends ServiceProvider implements DeferrableProvider
/**
* 注册服务提供者。
* @return void
*/
public function register()
$this->app->singleton(Connection::class, function ($app) {
return new Connection($app['config']['riak']);
});
/**
* 获取由提供者提供的服务。
* @return array
*/
public function provides()
return [Connection::class];
本文章首发在 LearnKu.com 网站上。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
原文地址:https://learnku.com/docs/laravel/5.8/pro...
译文地址:https://learnku.com/docs/laravel/5.8/pro...
上一篇
下一篇
Markdown 文本
纠错改进
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
贡献者:4
推荐文章:
更多推荐...
博客
用Go实现支持多种协议的抓包工具——Shermie-Proxy
22
33
5个月前
博客
国密招商银行对接
29
23
6个月前
博客
完整的php微服务案例
91
55
6个月前
博客
php开发的js逆向rpc框架
15
7个月前
博客
强一致性的分布式事务几种模式对比(php有了新方案)
31
19
1年前
博客
基于DTM分布式事务管理的PHP客户端
16
1年前
讨论数量: 2
发起讨论
只看当前版本
kiyoma
4年前
所以这个 register 到底是用来干嘛的?
15
个点赞 | 43 个回复 |
问答
| 课程版本 5.5
Jeffid
3年前
服务提供者延迟加载的坑
个点赞 | 3 个回复 |
分享
| 课程版本 5.7
社区赞助商
成为赞助商
关于 LearnKu
LearnKu 是终身编程者的修道场
做最专业、严肃的技术论坛
LearnKu 诞生的故事
资源推荐
《社区使用指南》
《文档撰写指南》
《LearnKu 社区规范》
《提问的智慧》
服务提供商
其他信息
成为版主
所有测验
联系站长(反馈建议)
粤ICP备18099781号-6
粤公网安备 44030502004330号
违法和不良信息举报
由 Summer 设计和编码 ❤
请登录
提交
忘记密码?
or
注册
第三方账号登录
微信登录
GitHub 登录
内容举报
匿名举报,为防止滥用,仅管理员可见举报者。
我要举报该,理由是:
垃圾广告:恶意灌水、广告、推广等内容
无意义内容:测试、灌水、文不对题、消极内容、文章品质太差等
违规内容:色情、暴利、血腥、敏感信息等
不友善内容:人身攻击、挑衅辱骂、恶意行为
科学上网:翻墙、VPN、Shadowsocks,政策风险,会被关站!
不懂提问:提问太随意,需要再做一遍《提问的智慧》测验
随意提问:提问没有发布在社区问答分类下
排版混乱:没有合理使用 Markdown 编写文章,未使用代码高亮
内容结构混乱:逻辑不清晰,内容混乱,难以阅读
标题随意:标题党、标题不释义
尊重版权:分享付费课程、破解软件(付费),侵犯作者劳动成果
其他理由:请补充说明
举报
取消