摘要:有一種機(jī)制來(lái)定義和執(zhí)行每個(gè)服務(wù)的初始處理,實(shí)現(xiàn)初始處理的類(lèi)稱(chēng)為服務(wù)提供者。在里面,要自定一個(gè)服務(wù)提供者非常容易,只要繼承這個(gè)類(lèi)即可。這個(gè)注冊(cè)的過(guò)程其實(shí)就是前面說(shuō)的實(shí)例化服務(wù)提供者的類(lèi),并調(diào)用方法的過(guò)程。
前言
? 上一篇博客文章收集了關(guān)于Laravel服務(wù)容器的相關(guān)知識(shí)(傳送門(mén)),我們知道了服務(wù)容器主要有綁定和解析兩個(gè)重要功能,那么Laravel這個(gè)框架集齊了如此多功能,我們項(xiàng)目可能還需要另外引入一些功能包,這些綁定必須有一個(gè)統(tǒng)一的管理工具,統(tǒng)一綁定在一個(gè)地方,這個(gè)地方就是服務(wù)提供者。
關(guān)于服務(wù)提供者? 一開(kāi)始學(xué)Laravel被服務(wù)容器和服務(wù)提供者兩個(gè)名稱(chēng)搞混了,其實(shí)現(xiàn)在我是這樣理解:容器就是底層一個(gè)大桶, 我們需要很多材料往里面填充,而提供者就是一些管道,我們就是通過(guò)提供者往容器里面塞我們需要的東西,需要的服務(wù)。
? Laravel有一種機(jī)制來(lái)定義和執(zhí)行每個(gè)服務(wù)的初始處理,實(shí)現(xiàn)初始處理的類(lèi)稱(chēng)為服務(wù)提供者。
? 服務(wù)提供者,在laravel里面,其實(shí)就是一個(gè)工廠類(lèi)。它最大的作用就是用來(lái)進(jìn)行服務(wù)綁定。當(dāng)我們需要綁定一個(gè)或多個(gè)服務(wù)的時(shí)候,可以自定義一個(gè)服務(wù)提供者,然后把服務(wù)綁定的邏輯都放在該類(lèi)的實(shí)現(xiàn)中。在larave里面,要自定一個(gè)服務(wù)提供者非常容易,只要繼承IlluminateSupportServiceProvider這個(gè)類(lèi)即可。下面通過(guò)一個(gè)簡(jiǎn)單的自定義服務(wù)提供者來(lái)說(shuō)明服務(wù)提供者的一些要點(diǎn):
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"]; } }
對(duì)于服務(wù)提供者類(lèi)可以通過(guò)artisan命令創(chuàng)建:
artisan make:provider yourServiceProvider
創(chuàng)建后的文件會(huì)存放在appProviders目錄下
? 現(xiàn)在我們的服務(wù)已經(jīng)在yourServiceProvider這個(gè)類(lèi)里面的register()里面進(jìn)行綁定了。雖然完成了服務(wù)提供者的創(chuàng)建和綁定,但框架現(xiàn)在不知道多了一個(gè)服務(wù)提供者,所以在程序運(yùn)行過(guò)程中還不會(huì)調(diào)用該類(lèi)中的registe()方法,所以需要在某個(gè)位置進(jìn)行注冊(cè)來(lái)告訴框架新創(chuàng)建的服務(wù)提供者--配置文件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, ],
當(dāng)laravel找到這個(gè)服務(wù)提供者的類(lèi)以后,就會(huì)初始化這個(gè)服務(wù)提供者類(lèi),得到一個(gè)服務(wù)提供者的對(duì)象,然后調(diào)用它的register方法,自然它里面的所有服務(wù)綁定代碼就都會(huì)執(zhí)行了:
public function registerConfiguredProviders() { $manifestPath = $this->getCachedServicesPath(); (new ProviderRepository($this, new Filesystem, $manifestPath)) ->load($this->config["app.providers"]); }
laravel會(huì)把所有的自定義服務(wù)提供者都注冊(cè)進(jìn)來(lái)。這個(gè)注冊(cè)的過(guò)程其實(shí)就是前面說(shuō)的實(shí)例化服務(wù)提供者的類(lèi),并調(diào)用register方法的過(guò)程。
? 除了register方法,服務(wù)提供者里面還有一個(gè)boot方法,這個(gè)boot方法,會(huì)在所有的服務(wù)提供者都注冊(cè)完成之后才會(huì)執(zhí)行,所以當(dāng)你想在服務(wù)綁定完成之后,通過(guò)容器解析出其它服務(wù),做一些初始化工作的時(shí)候,那么就可以這些邏輯寫(xiě)在boot方法里面。因?yàn)閎oot方法執(zhí)行的時(shí)候,所有服務(wù)提供者都已經(jīng)被注冊(cè)完畢了,所以在boot方法里面能夠確保其它服務(wù)都能被解析出來(lái)。
? 以上主要介紹了laravel服務(wù)提供器的作用和具體使用方法,在我們平時(shí)的開(kāi)發(fā)一般情況下引入第三方包就是這樣的步驟(舉例overtrue/laravel-wechat):
安裝引入:composer require "overtrue/laravel-wechat:~4.0"
在 config/app.php 注冊(cè) ServiceProvider 和 Facade(Laravel 5.5 無(wú)需手動(dòng)注冊(cè))
"providers" => [ // ... OvertrueLaravelWeChatServiceProvider::class, ], "aliases" => [ // ... "EasyWeChat" => OvertrueLaravelWeChatFacade::class, ],
創(chuàng)建配置文件
artisan vendor:publish --provider="OvertrueLaravelWeChatServiceProvider
服務(wù)提供者還有一個(gè)小問(wèn)題值的注意,由于php是一門(mén)基本語(yǔ)言,在處理請(qǐng)求的時(shí)候,都會(huì)從入口文件把所有php都執(zhí)行一遍。為了性能考慮,laravel會(huì)在第一次初始化的時(shí)候,把所有的服務(wù)提供者都緩存到bootstrap/cache/services.php文件里面,所以有時(shí)候當(dāng)你改了一個(gè)服務(wù)提供者的代碼以后,再刷新不一定能看到期望的效果,這有可能就是因?yàn)榫彺嫠?。這時(shí)把services.php刪掉就能看到你要的效果了。
?再次感 云諸葛這篇文章,看完后收貨很大,本文內(nèi)容較為粗略,想要詳細(xì)了解可以看這里laravel框架容器管理的一些要點(diǎn)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/29585.html
摘要:用匿名函數(shù)的好處在于,這個(gè)服務(wù)綁定到容器以后,并不會(huì)立即產(chǎn)生服務(wù)最終的對(duì)象,只有在這個(gè)服務(wù)解析的時(shí)候,匿名函數(shù)才會(huì)執(zhí)行,此時(shí)才會(huì)產(chǎn)生這個(gè)服務(wù)對(duì)應(yīng)的服務(wù)實(shí)例。 前言 ? 老實(shí)說(shuō),第一次老大讓我看laravel框架手冊(cè)的那天早上,我是很絕望的,因?yàn)檎娴臎](méi)接觸過(guò),對(duì)我這種渣渣來(lái)說(shuō),laravel的入門(mén)門(mén)檻確實(shí)有點(diǎn)高了,但還是得硬著頭皮看下去(雖然到現(xiàn)在我還有很多沒(méi)看懂,也沒(méi)用過(guò))。? 后面慢...
摘要:過(guò)去一年時(shí)間寫(xiě)了多篇文章來(lái)探討了我認(rèn)為的框架最核心部分的設(shè)計(jì)思路代碼實(shí)現(xiàn)。為了大家閱讀方便,我把這些源碼學(xué)習(xí)的文章匯總到這里。數(shù)據(jù)庫(kù)算法和數(shù)據(jù)結(jié)構(gòu)這些都是編程的內(nèi)功,只有內(nèi)功深厚了才能解決遇到的復(fù)雜問(wèn)題。 過(guò)去一年時(shí)間寫(xiě)了20多篇文章來(lái)探討了我認(rèn)為的Larave框架最核心部分的設(shè)計(jì)思路、代碼實(shí)現(xiàn)。通過(guò)更新文章自己在軟件設(shè)計(jì)、文字表達(dá)方面都有所提高,在剛開(kāi)始決定寫(xiě)Laravel源碼分析地...
摘要:面對(duì)這些較高的要求,前端在開(kāi)發(fā)環(huán)節(jié)中的作用也變得越來(lái)越重要因而近幾年來(lái)前端工程師備受青睞一般水平的前端工程師平均年薪可達(dá)萬(wàn)元資深前端工程師年薪高達(dá)萬(wàn)元。這種用戶(hù)體驗(yàn)的細(xì)節(jié)問(wèn)題是否處理妥當(dāng)是判斷一名前端工程師是否優(yōu)秀的因素。 本文是為了給那些想要了解前端開(kāi)發(fā)是什么,或者剛剛打算開(kāi)始學(xué)習(xí)前端的朋友們準(zhǔn)備,希望可以幫助準(zhǔn)備入行的你;showImg(https://segmentfault.c...
摘要:抽象比細(xì)節(jié)活的更長(zhǎng)久使用項(xiàng)目詞匯表名不正則言不順昂貴的工具不一定能制作出更好的設(shè)計(jì)早測(cè)試,常測(cè)試,自動(dòng)測(cè)試要到通過(guò)全部測(cè)試,編碼才算完成把網(wǎng)收緊,一個(gè)只抓一次溫和的超出用戶(hù)的期望在你的作品上簽名建立自己的藏書(shū)庫(kù) 1 關(guān)心你的技藝 2 思考你的工作 3 在所有的弱點(diǎn)中,最大的弱點(diǎn)就是害怕暴露弱點(diǎn) 4 提供各種選擇,不要找各種蹩腳的借口 5 不要容忍破窗戶(hù) 6 作變化的催化劑 7 記住...
摘要:結(jié)合我自己的經(jīng)驗(yàn),我整理了一份全棧工程師進(jìn)階路線(xiàn)圖,給大家參考。乾坤大挪移第一層第一層心法,主要都是基本語(yǔ)法,程序設(shè)計(jì)入門(mén),悟性高者十天半月可成,差一點(diǎn)的到個(gè)月也說(shuō)不準(zhǔn)。 技術(shù)更新日新月異,對(duì)于初入職場(chǎng)的同學(xué)來(lái)說(shuō),經(jīng)常會(huì)困惑該往那個(gè)方向發(fā)展,這一點(diǎn)松哥是深有體會(huì)的。 我剛開(kāi)始學(xué)習(xí) Java 那會(huì),最大的問(wèn)題就是不知道該學(xué)什么,以及學(xué)習(xí)的順序,我相信這也是很多初學(xué)者經(jīng)常面臨的問(wèn)題。?我...
閱讀 2752·2021-10-26 09:50
閱讀 2396·2021-10-11 11:08
閱讀 2135·2019-08-30 15:53
閱讀 1913·2019-08-30 15:44
閱讀 2389·2019-08-28 18:12
閱讀 2528·2019-08-26 13:59
閱讀 2860·2019-08-26 12:19
閱讀 2759·2019-08-26 12:09