亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

laravel 自定義服務(wù)提供者

Pikachu / 2555人閱讀

摘要:看起來很麻煩是吧,完全可以封裝一個(gè)函數(shù),直接調(diào)用就可以了,沒有必要自定義服務(wù)提供者創(chuàng)建契約。將自定義的服務(wù)提供者做如下修改修改了契約的綁定,所有使用契約進(jìn)行依賴注入的實(shí)例,都會(huì)由實(shí)例切換到實(shí)例。

導(dǎo)語

laravel 的服務(wù)提供者,是框架的核心,提供了路由、日志、緩存等功能。這里要實(shí)現(xiàn)的需求是使用第三方 API 獲取天氣情況,涉及到服務(wù)提供者、契約、依賴注入等方面。相關(guān)內(nèi)容可以通過下方參考資料進(jìn)行了解,本文內(nèi)容不進(jìn)行展開介紹,代碼可查看 GitHub。

創(chuàng)建服務(wù)提供者

可以使用 artisan 快捷的創(chuàng)建服務(wù)提供者,執(zhí)行 php artisan make:provider WeatherServiceProvider 即在 app/Providers 目錄下創(chuàng)建了 WeatherServiceProvider.php 文件;

config/app.php 中注冊服務(wù)提供者,在 providers 數(shù)組中將創(chuàng)建的服務(wù)提供者 AppProvidersWeatherServiceProvider::class, 寫入,如下

創(chuàng)建契約

app 目錄下新建 Contracts 目錄用以存放契約文件;

app/Contracts 目錄下創(chuàng)建契約,即 Weather.php 接口文件。在接口中只定義了 public function getWeather($cityName); 一個(gè)方法用于獲取天氣信息;

實(shí)現(xiàn)契約

app 目錄下新建 Service/Weather 目錄用于存放實(shí)現(xiàn) Weather.php 契約的文件;

選擇一個(gè)第三方的天氣 API 來實(shí)現(xiàn)契約。這里使用的是心知天氣。關(guān)于 API 的調(diào)用,可以查看文檔;

最終創(chuàng)建的文件是 app/Service/Weather/Xinzhi.php。繼承了 Weather.php 接口文件,所有要實(shí)現(xiàn) getWeather 方法,代碼可查看 GitHub;

這里先埋個(gè)伏筆。除了上面的 Xinzhi.php,另外選擇和風(fēng)天氣實(shí)現(xiàn)契約,文件為 app/Service/Weather/Hefeng.php。代碼查看 GitHub;

服務(wù)提供者綁定

我們已經(jīng)實(shí)現(xiàn)了契約,接下來就是綁定具體實(shí)現(xiàn)類。回到開始創(chuàng)建的服務(wù)提供者,在 register 方法中添加如下代碼

$this->app->bind("AppContractsWeather", function() {
    return new Xinzhi();
});

最后就可以正常使用了。新建路由,然后測試。試下通過依賴注入調(diào)用

public function getWeather(Request $request, Weather $weather)
{
    return $weather->getWeather($request->input("city", "beijing"));
}

沒有問題

解耦

完成上述所有步驟,這個(gè)需求已經(jīng)實(shí)現(xiàn)了。看起來很麻煩是吧,完全可以封裝一個(gè)函數(shù),直接調(diào)用就可以了,沒有必要自定義服務(wù)提供者、創(chuàng)建契約。實(shí)際上述步驟,其中的一個(gè)目的就是小標(biāo)題那兩個(gè)字——解耦。
假設(shè)一下,我們需要在很多代碼中使用這個(gè)功能,突然有一天,這個(gè) API 掛了,怎么辦?四處去查找、檢查代碼,然后再去修改,同時(shí)要注意參數(shù)、返回值等。光是聽起來就很煩了。這個(gè)時(shí)候,如果我們的代碼按照上述的步驟進(jìn)行開發(fā),解決方法就大不相同了。簡而言之,一行代碼就可以搞定。
還記得上面那個(gè)伏筆吧,一共有兩個(gè)實(shí)例實(shí)現(xiàn)了接口。將自定義的服務(wù)提供者 register 做如下修改

$this->app->bind("AppContractsWeather", function() {
       // return new Xinzhi();
        return new Hefeng();
});

修改了契約的綁定,所有使用 Weather 契約進(jìn)行依賴注入的實(shí)例,都會(huì)由 Xinzhi.php 實(shí)例切換到 Hefeng.php 實(shí)例。

契約當(dāng)然不止解耦這一個(gè)作用,代碼更容易理解、更方便維護(hù),甚至可以當(dāng)做簡明的開發(fā)文檔。更多的深入理解,請查看下方參考資料。


參考資料:底層原理 —— 服務(wù)提供者、底層原理 —— 契約(Contracts)、Laravel 服務(wù)容器實(shí)例教程 —— 深入理解控制反轉(zhuǎn)(IoC)和依賴注入(DI)、 Laravel 從學(xué)徒到工匠系列 依賴注入篇。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/31188.html

相關(guān)文章

  • Laravel深入學(xué)習(xí)7 - 框架的擴(kuò)展

    摘要:組件擴(kuò)展通常有兩種方法向容器中綁定自己的接口實(shí)現(xiàn)痛過使用工廠模式實(shí)現(xiàn)的類注冊自己的擴(kuò)展。類庫管理類以工廠模式實(shí)現(xiàn),負(fù)責(zé)諸如緩存等驅(qū)動(dòng)的實(shí)例化。閉包須要傳入繼承自和容器的實(shí)例化對象。當(dāng)完成擴(kuò)展之后要記住中替換成自己的擴(kuò)展名稱。 聲明:本文并非博主原創(chuàng),而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當(dāng)然也不是原汁原味的翻譯,能保證9...

    yuanxin 評論0 收藏0
  • Laravel思維導(dǎo)圖之HTTP請求、響應(yīng)、表單驗(yàn)證

    摘要:今天我來分享中層關(guān)于請求響應(yīng)與表單驗(yàn)證的知識。手動(dòng)創(chuàng)建驗(yàn)證請求之前的內(nèi)容是直接使用的方法來實(shí)現(xiàn)表單驗(yàn)證。下一步到這篇為止,我完成了入門指南核心概念層的路由中間件控制器請求響應(yīng)表單驗(yàn)證的學(xué)習(xí)和整理。 showImg(https://segmentfault.com/img/remote/1460000010882838); 今天我來分享 Laravel 中 HTTP 層關(guān)于請求、響應(yīng)與表...

    lewif 評論0 收藏0
  • Laravel 動(dòng)態(tài)添加 Artisan 命令的最佳實(shí)踐

    摘要:初步嘗試既然最常見的注冊命令的方式是修改類中的,那么一般正常人都會(huì)從這邊開始下手。又要自己取出實(shí)例,又要自己調(diào)用方法,調(diào)用方法之前還有自己先把實(shí)例化這么繁瑣,肯定不是運(yùn)行時(shí)添加命令的最佳實(shí)踐,所以我決定繼續(xù)尋找更優(yōu)解。 本文首發(fā)于我的博客,原文鏈接:https://blessing.studio/best-... 雖然 Laravel 官方文檔提供的添加 Artisan Command...

    ninefive 評論0 收藏0
  • Laravel 服務(wù)供者指南

    摘要:在服務(wù)提供者內(nèi)部,這個(gè)工作被稱之為服務(wù)容器綁定,綁定處理由服務(wù)提供者完成。通過服務(wù)提供者綁定服務(wù)是服務(wù)容器綁定服務(wù)的正確打開方式。為了完成注冊服務(wù)提供者的功能,僅需要將類名加入到配置文件的節(jié)點(diǎn)。此時(shí),僅需簡單的調(diào)整下服務(wù)提供者中的代碼。 這是一篇翻譯文章,譯文首發(fā)于 Laravel 服務(wù)提供者指南,轉(zhuǎn)載請注明出處。 如果你使用過 Laravel 框架的話,那么,你不可能沒聽說過服務(wù)容器...

    wzyplus 評論0 收藏0
  • Laravel修煉:服務(wù)供者

    摘要:有一種機(jī)制來定義和執(zhí)行每個(gè)服務(wù)的初始處理,實(shí)現(xiàn)初始處理的類稱為服務(wù)提供者。在里面,要自定一個(gè)服務(wù)提供者非常容易,只要繼承這個(gè)類即可。這個(gè)注冊的過程其實(shí)就是前面說的實(shí)例化服務(wù)提供者的類,并調(diào)用方法的過程。 前言 ? 上一篇博客文章收集了關(guān)于Laravel服務(wù)容器的相關(guān)知識(傳送門),我們知道了服務(wù)容器主要有綁定和解析兩個(gè)重要功能,那么Laravel這個(gè)框架集齊了如此多功能,我們項(xiàng)目可能還...

    idealcn 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<