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