热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

riakphp7,服务提供者|核心架构|Laravel7中文文档

服务提供者由学院君创建于1年前,最后更新于1年前版本号#33520views0likes0collects简介服务提供者是Laravel应用启动的中心,你自己的应用以

服务提供者

由 学院君 创建于1年前, 最后更新于 1年前

版本号 #3

3520 views

0 likes

0 collects

简介

服务提供者是 Laravel 应用启动的中心,你自己的应用以及所有 Laravel 的核心服务都是通过服务提供者启动。

但是,我们所谓的「启动」指的是什么?通常,这意味着注册服务,包括注册服务容器绑定、事件监听器、中间件甚至路由。服务提供者是应用配置的中心。

如果你打开 Laravel 自带的 config/app.php 文件,将会看到一个 providers 数组,这里就是应用所要加载的所有服务提供者类,当然,其中很多是延迟加载的,也就是说不是每次请求都会被加载,只有真的用到它们的时候才会加载。

通过本文档,你将会学习如何编写自己的服务提供者并在 Laravel 应用中注册它们。

编写服务提供者

所有的服务提供者都继承自 Illuminate\Support\ServiceProvider 类。大部分服务提供者都包含两个方法: register 和 boot 。在 register 方法中,你唯一要做的事情就是绑定服务到服务容器,不要尝试在该方法中注册事件监听器,路由或者任何其它功能。

通过 Artisan 命令 make:provider 即可生成一个新的提供者:

php artisan make:provider RiakServiceProvider

register 方法

正如前面所提到的,在 register 方法中只绑定服务到服务容器,而不要做其他事情,否则,一不小心就可能用到一个尚未被加载的服务提供者提供的服务。

现在让我们来看看一个基本的服务提供者长什么样,在任何服务提供者方法中,都可以通过 $app 属性来访问服务容器:

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 属性来替代手动注册每个容器绑定以简化代码。当服务提供者被框架加载后,会自动检查这些属性并注册相应绑定:

namespace App\Providers;

use App\Contracts\ServerProvider;

use App\Contracts\DowntimeNotifier;

use App\Services\ServerToolsProvider;

use Illuminate\Support\ServiceProvider;

use App\Services\PingdomDowntimeNotifier;

use App\Services\DigitalOceanServerProvider;

class AppServiceProvider extends ServiceProvider

{

/**

* All of the container bindings that should be registered.

*

* @var array

*/

public $bindings = [

ServerProvider::class => DigitalOceanServerProvider::class,

];

/**

* All of the container singletons that should be registered.

*

* @var array

*/

public $singletons = [

DowntimeNotifier::class => PingdomDowntimeNotifier::class,

ServerToolsProvider::class => ServerToolsProvider::class,

];

}

boot 方法

如果我们想要在服务提供者中注册视图 Composer 该怎么做?这就要用到 boot 方法了。该方法在所有服务提供者被注册以后才会被调用,这就是说我们可以在其中访问框架已注册的所有其它服务:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider{

/**

* Perform post-registration booting of services.

*

* @return void

*/

public function boot()

{

view()->composer('view', function () {

//

});

}

}

boot 方法的依赖注入

我们可以在 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 方法会返回通过服务提供者注册的服务容器绑定:

namespace App\Providers;

use Riak\Connection;

use Illuminate\Support\ServiceProvider;

use Illuminate\Contracts\Support\DeferrableProvider;

class RiakServiceProvider extends ServiceProvider implements DeferrableProvider

{

/**

* Register the service provider.

*

* @return void

*/

public function register()

{

$this->app->singleton(Connection::class, function ($app) {

return new Connection($app['config']['riak']);

});

}

/**

* Get the services provided by the provider.

*

* @return array

*/

public function provides()

{

return [Connection::class];

}

}

相关阅读



推荐阅读
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
  • php composer 安装,phpstudy  composer 使用安装
    本人是windows系统phpstudy是最新2018版本以安装laravel框架为例子一如图一,点击phpComposer出现系统指令框,根据指令框路 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 解决文件名过长下载失败问题的jQuery方案
    本文介绍了使用jQuery解决文件名过长导致下载失败的问题。原方案中存在文件名部分丢失的问题,通过动态生成隐藏域表单并提交的方式来解决。详细的解决方案和代码示例在文章中给出。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • php怎么创建项目目录,ThinkPHP 5.1自动生成模块及目录、文件
    试用一下ThinkPHP5.1这最新版的TP框架,创建项目很简单,在web根目录使用composer搞定:composercreate-p ... [详细]
  • L05 Laravel 教程电商实战
    https:laravel-china.orgcourseslaravel-shophttps:laravel-china.orgtopics13206laravel-shop-c ... [详细]
author-avatar
购物狂RZBZ_719
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有