资讯专栏INFORMATION COLUMN

Laravel修炼:服务提供者

idealcn / 2703人阅读

摘要:有一种机制来定义和执行每个服务的初始处理,实现初始处理的类称为服务提供者。在里面,要自定一个服务提供者非常容易,只要继承这个类即可。这个注册的过程其实就是前面说的实例化服务提供者的类,并调用方法的过程。

前言

  上一篇博客文章收集了关于Laravel服务容器的相关知识(传送门),我们知道了服务容器主要有绑定和解析两个重要功能,那么Laravel这个框架集齐了如此多功能,我们项目可能还需要另外引入一些功能包,这些绑定必须有一个统一的管理工具,统一绑定在一个地方,这个地方就是服务提供者。

关于服务提供者

  一开始学Laravel被服务容器和服务提供者两个名称搞混了,其实现在我是这样理解:容器就是底层一个大桶, 我们需要很多材料往里面填充,而提供者就是一些管道,我们就是通过提供者往容器里面塞我们需要的东西,需要的服务。

  Laravel有一种机制来定义和执行每个服务的初始处理,实现初始处理的类称为服务提供者

  服务提供者,在laravel里面,其实就是一个工厂类。它最大的作用就是用来进行服务绑定。当我们需要绑定一个或多个服务的时候,可以自定义一个服务提供者,然后把服务绑定的逻辑都放在该类的实现中。在larave里面,要自定一个服务提供者非常容易,只要继承IlluminateSupportServiceProvider这个类即可。下面通过一个简单的自定义服务提供者来说明服务提供者的一些要点:

app->singleton("service1", function(){
            return "service1";
        });
        $this->app->singleton("service2", function(){
            return "service2";
        });
        $this->app->singleton("service3", function(){
            return "service3";
        });
    }

    public  function provides()
    {
        return ["service1","service2","service3"];
    }
}

对于服务提供者类可以通过artisan命令创建:

artisan make:provider yourServiceProvider

创建后的文件会存放在appProviders目录下

  现在我们的服务已经在yourServiceProvider这个类里面的register()里面进行绑定了。虽然完成了服务提供者的创建和绑定,但框架现在不知道多了一个服务提供者,所以在程序运行过程中还不会调用该类中的registe()方法,所以需要在某个位置进行注册来告诉框架新创建的服务提供者--配置文件config/app.php

    "providers" => [

        /*
         * Laravel Framework Service Providers...
         */
        IlluminateAuthAuthServiceProvider::class,
        IlluminateBroadcastingBroadcastServiceProvider::class,
        IlluminateBusBusServiceProvider::class,
        IlluminateCacheCacheServiceProvider::class,
        IlluminateFoundationProvidersConsoleSupportServiceProvider::class,
        ...
        ...
        ...
        AppProvidersAppServiceProvider::class,
        AppProvidersAuthServiceProvider::class,
        // AppProvidersBroadcastServiceProvider::class,
        AppProvidersEventServiceProvider::class,
        AppProvidersRouteServiceProvider::class,

    ],

当laravel找到这个服务提供者的类以后,就会初始化这个服务提供者类,得到一个服务提供者的对象,然后调用它的register方法,自然它里面的所有服务绑定代码就都会执行了:

public function registerConfiguredProviders()
    {
        $manifestPath = $this->getCachedServicesPath();

        (new ProviderRepository($this, new Filesystem, $manifestPath))
                    ->load($this->config["app.providers"]);
    }

laravel会把所有的自定义服务提供者都注册进来。这个注册的过程其实就是前面说的实例化服务提供者的类,并调用register方法的过程。

  除了register方法,服务提供者里面还有一个boot方法,这个boot方法,会在所有的服务提供者都注册完成之后才会执行,所以当你想在服务绑定完成之后,通过容器解析出其它服务,做一些初始化工作的时候,那么就可以这些逻辑写在boot方法里面。因为boot方法执行的时候,所有服务提供者都已经被注册完毕了,所以在boot方法里面能够确保其它服务都能被解析出来。

  以上主要介绍了laravel服务提供器的作用和具体使用方法,在我们平时的开发一般情况下引入第三方包就是这样的步骤(举例overtrue/laravel-wechat):

安装引入:composer require "overtrue/laravel-wechat:~4.0"

在 config/app.php 注册 ServiceProvider 和 Facade(Laravel 5.5 无需手动注册)

"providers" => [
    // ...
    OvertrueLaravelWeChatServiceProvider::class,
],
"aliases" => [
    // ...
    "EasyWeChat" => OvertrueLaravelWeChatFacade::class,
],

创建配置文件

artisan vendor:publish --provider="OvertrueLaravelWeChatServiceProvider
服务提供者还有一个小问题值的注意,由于php是一门基本语言,在处理请求的时候,都会从入口文件把所有php都执行一遍。为了性能考虑,laravel会在第一次初始化的时候,把所有的服务提供者都缓存到bootstrap/cache/services.php文件里面,所以有时候当你改了一个服务提供者的代码以后,再刷新不一定能看到期望的效果,这有可能就是因为缓存所致。这时把services.php删掉就能看到你要的效果了。

 再次感 云诸葛这篇文章,看完后收货很大,本文内容较为粗略,想要详细了解可以看这里laravel框架容器管理的一些要点

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29585.html

相关文章

  • Laravel修炼服务容器绑定与解析

    摘要:用匿名函数的好处在于,这个服务绑定到容器以后,并不会立即产生服务最终的对象,只有在这个服务解析的时候,匿名函数才会执行,此时才会产生这个服务对应的服务实例。 前言   老实说,第一次老大让我看laravel框架手册的那天早上,我是很绝望的,因为真的没接触过,对我这种渣渣来说,laravel的入门门槛确实有点高了,但还是得硬着头皮看下去(虽然到现在我还有很多没看懂,也没用过)。  后面慢...

    The question 评论0 收藏0
  • Laravel核心解读--完结篇

    摘要:过去一年时间写了多篇文章来探讨了我认为的框架最核心部分的设计思路代码实现。为了大家阅读方便,我把这些源码学习的文章汇总到这里。数据库算法和数据结构这些都是编程的内功,只有内功深厚了才能解决遇到的复杂问题。 过去一年时间写了20多篇文章来探讨了我认为的Larave框架最核心部分的设计思路、代码实现。通过更新文章自己在软件设计、文字表达方面都有所提高,在刚开始决定写Laravel源码分析地...

    laoLiueizo 评论0 收藏0
  • 零基础入门前端的修炼之道

    摘要:面对这些较高的要求,前端在开发环节中的作用也变得越来越重要因而近几年来前端工程师备受青睐一般水平的前端工程师平均年薪可达万元资深前端工程师年薪高达万元。这种用户体验的细节问题是否处理妥当是判断一名前端工程师是否优秀的因素。 本文是为了给那些想要了解前端开发是什么,或者刚刚打算开始学习前端的朋友们准备,希望可以帮助准备入行的你;showImg(https://segmentfault.c...

    JiaXinYi 评论0 收藏0
  • 【笔记】 程序员修炼之道 从小工到专家

    摘要:抽象比细节活的更长久使用项目词汇表名不正则言不顺昂贵的工具不一定能制作出更好的设计早测试,常测试,自动测试要到通过全部测试,编码才算完成把网收紧,一个只抓一次温和的超出用户的期望在你的作品上签名建立自己的藏书库 1 关心你的技艺 2 思考你的工作 3 在所有的弱点中,最大的弱点就是害怕暴露弱点 4 提供各种选择,不要找各种蹩脚的借口 5 不要容忍破窗户 6 作变化的催化剂 7 记住...

    cppprimer 评论0 收藏0
  • 2019 Java 全栈工程师进阶路线图,一定要收藏

    摘要:结合我自己的经验,我整理了一份全栈工程师进阶路线图,给大家参考。乾坤大挪移第一层第一层心法,主要都是基本语法,程序设计入门,悟性高者十天半月可成,差一点的到个月也说不准。 技术更新日新月异,对于初入职场的同学来说,经常会困惑该往那个方向发展,这一点松哥是深有体会的。 我刚开始学习 Java 那会,最大的问题就是不知道该学什么,以及学习的顺序,我相信这也是很多初学者经常面临的问题。​我...

    wangdai 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<