摘要:看起來很麻煩是吧,完全可以封裝一個函數,直接調用就可以了,沒有必要自定義服務提供者創建契約。將自定義的服務提供者做如下修改修改了契約的綁定,所有使用契約進行依賴注入的實例,都會由實例切換到實例。
導語
laravel 的服務提供者,是框架的核心,提供了路由、日志、緩存等功能。這里要實現的需求是使用第三方 API 獲取天氣情況,涉及到服務提供者、契約、依賴注入等方面。相關內容可以通過下方參考資料進行了解,本文內容不進行展開介紹,代碼可查看 GitHub。
創建服務提供者可以使用 artisan 快捷的創建服務提供者,執行 php artisan make:provider WeatherServiceProvider 即在 app/Providers 目錄下創建了 WeatherServiceProvider.php 文件;
在 config/app.php 中注冊服務提供者,在 providers 數組中將創建的服務提供者 AppProvidersWeatherServiceProvider::class, 寫入,如下
創建契約在 app 目錄下新建 Contracts 目錄用以存放契約文件;
在 app/Contracts 目錄下創建契約,即 Weather.php 接口文件。在接口中只定義了 public function getWeather($cityName); 一個方法用于獲取天氣信息;
實現契約在 app 目錄下新建 Service/Weather 目錄用于存放實現 Weather.php 契約的文件;
選擇一個第三方的天氣 API 來實現契約。這里使用的是心知天氣。關于 API 的調用,可以查看文檔;
最終創建的文件是 app/Service/Weather/Xinzhi.php。繼承了 Weather.php 接口文件,所有要實現 getWeather 方法,代碼可查看 GitHub;
這里先埋個伏筆。除了上面的 Xinzhi.php,另外選擇和風天氣實現契約,文件為 app/Service/Weather/Hefeng.php。代碼查看 GitHub;
服務提供者綁定我們已經實現了契約,接下來就是綁定具體實現類。回到開始創建的服務提供者,在 register 方法中添加如下代碼
$this->app->bind("AppContractsWeather", function() { return new Xinzhi(); });
最后就可以正常使用了。新建路由,然后測試。試下通過依賴注入調用
public function getWeather(Request $request, Weather $weather) { return $weather->getWeather($request->input("city", "beijing")); }
沒有問題
解耦完成上述所有步驟,這個需求已經實現了。看起來很麻煩是吧,完全可以封裝一個函數,直接調用就可以了,沒有必要自定義服務提供者、創建契約。實際上述步驟,其中的一個目的就是小標題那兩個字——解耦。
假設一下,我們需要在很多代碼中使用這個功能,突然有一天,這個 API 掛了,怎么辦?四處去查找、檢查代碼,然后再去修改,同時要注意參數、返回值等。光是聽起來就很煩了。這個時候,如果我們的代碼按照上述的步驟進行開發,解決方法就大不相同了。簡而言之,一行代碼就可以搞定。
還記得上面那個伏筆吧,一共有兩個實例實現了接口。將自定義的服務提供者 register 做如下修改
$this->app->bind("AppContractsWeather", function() { // return new Xinzhi(); return new Hefeng(); });
修改了契約的綁定,所有使用 Weather 契約進行依賴注入的實例,都會由 Xinzhi.php 實例切換到 Hefeng.php 實例。
契約當然不止解耦這一個作用,代碼更容易理解、更方便維護,甚至可以當做簡明的開發文檔。更多的深入理解,請查看下方參考資料。
參考資料:底層原理 —— 服務提供者、底層原理 —— 契約(Contracts)、Laravel 服務容器實例教程 —— 深入理解控制反轉(IoC)和依賴注入(DI)、 Laravel 從學徒到工匠系列 依賴注入篇。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31188.html
摘要:組件擴展通常有兩種方法向容器中綁定自己的接口實現痛過使用工廠模式實現的類注冊自己的擴展。類庫管理類以工廠模式實現,負責諸如緩存等驅動的實例化。閉包須要傳入繼承自和容器的實例化對象。當完成擴展之后要記住中替換成自己的擴展名稱。 聲明:本文并非博主原創,而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當然也不是原汁原味的翻譯,能保證9...
摘要:今天我來分享中層關于請求響應與表單驗證的知識。手動創建驗證請求之前的內容是直接使用的方法來實現表單驗證。下一步到這篇為止,我完成了入門指南核心概念層的路由中間件控制器請求響應表單驗證的學習和整理。 showImg(https://segmentfault.com/img/remote/1460000010882838); 今天我來分享 Laravel 中 HTTP 層關于請求、響應與表...
摘要:初步嘗試既然最常見的注冊命令的方式是修改類中的,那么一般正常人都會從這邊開始下手。又要自己取出實例,又要自己調用方法,調用方法之前還有自己先把實例化這么繁瑣,肯定不是運行時添加命令的最佳實踐,所以我決定繼續尋找更優解。 本文首發于我的博客,原文鏈接:https://blessing.studio/best-... 雖然 Laravel 官方文檔提供的添加 Artisan Command...
摘要:在服務提供者內部,這個工作被稱之為服務容器綁定,綁定處理由服務提供者完成。通過服務提供者綁定服務是服務容器綁定服務的正確打開方式。為了完成注冊服務提供者的功能,僅需要將類名加入到配置文件的節點。此時,僅需簡單的調整下服務提供者中的代碼。 這是一篇翻譯文章,譯文首發于 Laravel 服務提供者指南,轉載請注明出處。 如果你使用過 Laravel 框架的話,那么,你不可能沒聽說過服務容器...
摘要:有一種機制來定義和執行每個服務的初始處理,實現初始處理的類稱為服務提供者。在里面,要自定一個服務提供者非常容易,只要繼承這個類即可。這個注冊的過程其實就是前面說的實例化服務提供者的類,并調用方法的過程。 前言 ? 上一篇博客文章收集了關于Laravel服務容器的相關知識(傳送門),我們知道了服務容器主要有綁定和解析兩個重要功能,那么Laravel這個框架集齊了如此多功能,我們項目可能還...
閱讀 808·2021-11-25 09:43
閱讀 1673·2021-09-29 09:42
閱讀 1892·2019-08-30 15:55
閱讀 3413·2019-08-30 15:54
閱讀 2617·2019-08-30 13:20
閱讀 3500·2019-08-29 13:25
閱讀 907·2019-08-28 18:03
閱讀 1777·2019-08-26 13:44