摘要:使用現在,在任何一個控制器,或者路由的回調函數中,使用你會發現,已經可以好好工作了,參考文章設計模式九外觀模式結構型服務容器實例教程深入理解控制反轉和依賴注入服務提供者實例教程創建測試實例
我的博客原文: http://www.qinblog.net/Articl...前言
laravel 提供了一個靈活的模式,那就是 facade ??蚣軆炔康?DB、Auth、File 等功能也有相關的 facade 實現。那么,該如何寫自己的 facade 呢?
Facade 是什么?首先,facade 并不是 laravel 獨有的東西,它就是設計模式中的外觀模式(Facade)。
當然,這里就不長篇大論去討論外觀模式的定義了。這篇文章寫的很不錯 : 設計模式(九)外觀模式Facade(結構型)。
那么,laravel 的 facade 做了什么?
同樣的, laravel 實現了外觀模式的開關功能,并且使用魔術方法 __callstatic 實現了靜態方式調用、動態創建對象的功能。參考 (官方文檔)
當然你可能覺得這些概念很抽象,都什么玩意。那么其實簡單的講,laravel 的 facade 就是將某些功能封裝成工具類,而且能以靜態方式調用工具類的方法。
建立自己的 facade首先、以 laravel 5.1 框架,我之前寫過的 Geoip facade 為例,說一下怎么去建立自己的 facade。
下載 geoip 擴展geoip 是一個可以更具 IP 獲取國家、地域、城市信息的 PHP 擴展,基于 maxmind 數據庫。 github 在此。
首先,為 laravel 添加 geoip 擴展。
打開 composer.json,添加 "geoip2/geoip2": "~2.0" 到 require。
項目根目錄運行 composer update ( 需要安裝 composer )更新一下,geoip 的依賴和軟件包就被下載到 vendor 文件夾中了。
然后下載 geoip 依賴的數據庫,免費庫的地址 : GeoLite2
我下載了 GeoLite2 Country 和 GeoLite2 City 庫,放到了 storage/geoipdb 中。
建立 facade。在 app 目錄下新建 Facades 文件夾,里面新建 Facades/GeoIP/GeoIP.php 和 Facades/GeoIP/Facade/GeoIP.php (建議每個功能新建一個文件夾區分,比如我這里給 GeoIP 新建一個文件夾,關于GeoIP 的東西全放到這里)
注意,Facades/GeoIP 下的 GeoIP.php 是你要對 geoip 擴展進行封裝的類, Facades/GeoIP/Facade 下的 GeoIP.php 是你的 facade,用來給 laravel 解析使用,這兩個文件可以不同名。
目錄結構如圖:
Facades/GeoIP/Facade/GeoIP.php 如下
注意你的 facade 現在只有一個方法,返回了一個字符串 "geoip" , 這個字符串是一個標號,用來給 laravel 的服務提供者解析使用的。
Facades/GeoIP/GeoIP.php 如下(吐槽:寫的有點隨意)
_country_db; break; case "getCity": $path = $this->_city_db; break; default: break; } $this->_instance = new Reader(storage_path($path)); } /** * Get Country infomations. * * @param String $ip * @return Array */ public function getCountry($ip) { $this->init(__FUNCTION__); $record = $this->_instance->country($ip); // 國家信息 $data["iso_code"] = $record->country->isoCode; $data["country_name"] = $record->country->name; $data["country_name_zh_cn"] = $record->country->names["zh-CN"]; return $data; } /** * Get City infomations. * * @param String $ip * @return Array */ public function getCity($ip) { $this->init(__FUNCTION__); $record = $this->_instance->city($ip); $data["iso_code"] = $record->country->isoCode; $data["country_name"] = $record->country->name; $data["country_name_zh_cn"] = $record->country->names["zh-CN"]; // 省、州信息 $data["sub_division_name"] = $record->mostSpecificSubdivision->name; $data["sub_division_name_zh_cn"] = $record->mostSpecificSubdivision->names["zh-CN"]; $data["sub_division_code"] = $record->mostSpecificSubdivision->isoCode; // 城市信息 $data["city_name"] = $record->city->name; $data["postal_code"] = $record->postal->code; // 經緯度 $data["latitude"] = $record->location->latitude; $data["longitude"] = $record->location->longitude; return $data; } }OK,現在 geoip 的常用功能已經封裝到方法中了。
注冊服務完成了 facade 的創建和功能封裝,下面就要使用它了。自己創建的 facade 要在 laravel 使用是要進行注冊的,以便 laraval 在啟動時能自動注入依賴(請看 laravel 的依賴注入簡介 : laravel 依賴注入 學院君)
編寫服務提供者在 app/Providers 下新建 FacadesServiceProvider.php
可以手動建,也可以用 artisan 命令來生成,隨你喜歡。
app/Providers/FacadesServiceProvider.php 代碼如下:app->singleton("geoip", function ($app) { return new GeoIP($app); }); } }上面代碼可知,服務提供者注冊時會注冊一個單例,標號為 "geoip",也就是我們自己的 facade 返回的那個,然后回調函數會返回一個對象,也就是我們封裝 geoip 功能的那個類的實例,不明白的同學可以看看 laravel 的服務提供者和服務容器相關知識哦。(注意要 use 將 facade 和封裝類的命名空間引用一下哦)
注冊服務提供者laravel 5.1 以上版本的話, config/app.php 中找到 providers 和 aliases ,將你的服務提供者和 facade 別名配置一下 :
providers 加入 :
AppProvidersFacadeServiceProvider::class,aliases 加入(不用每次都寫很長的命名空間前綴) :
"GeoIP" => AppFacadesGeoIPFacadeGeoIP::class,對于 lumen 5.2 以上,需要在 bootstrap/app.php 中添加
$app->register(AppProvidersFacadesServiceProvider::class);注冊完畢后,每次使用 facade::function 的時候,laravel 會自動解析 facade, 然后創建一個對象給用戶使用,,而無需用戶自己去 new 一個對象出來。
使用現在,在任何一個控制器,或者路由的回調函數中,使用
$res = GeoIP::getCountry("75.101.195.215"); var_dump($res);你會發現,facade 已經可以好好工作了,enjoy!
參考文章【1】設計模式(九)外觀模式Facade(結構型)
【2】Laravel 服務容器實例教程 —— 深入理解控制反轉(IoC)和依賴注入(DI)
【3】Laravel 服務提供者實例教程 —— 創建 Service Provider 測試實例
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30581.html
摘要:容器主要的作用就是生產各種零件,就是提供各個服務。的原理我們以為例,來講解一下門面的原理與實現。當運行時,發現門面沒有靜態函數,就會調用這個魔術函數。我們看到這個魔術函數做了兩件事獲得對象實例,利用對象調用函數。 前言 在開始之前,歡迎關注我自己的博客:www.leoyang90.cn這篇文章我們開始講 laravel 框架中的門面 Facade,什么是門面呢?官方文檔: Facade...
摘要:那么如果用的方式會怎么樣呢現在,不僅看起來更簡潔優雅,而且也可以測試了,因為可以進行,比如說這樣你會發現最有用的地方就是構建簡潔優雅的,同時呢又不會影響到代碼的可測試性。 本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學習群:109256050 該篇翻譯整理自laravel創始人Taylor的文章:Expressive Code & Real ...
摘要:本文來自原文鏈接歡迎作客我們的學習群該篇屬于底層核心技術實戰揭秘這一課程底層核心概念解析這一章的擴展閱讀??紤]到學員們的基礎差異,為了避免視頻當中過于詳細而連篇累牘,故將一些底層實現相關的知識點以文章形式呈現,供大家預習和隨時查閱。 本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學習群:109256050該篇屬于《Laravel底層核心技術實戰...
摘要:外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。將使用者與子系統從直接耦合,轉變成由外觀類提供統一的接口給使用者使用,以降低客戶端與子系統之間的耦合度。接下來將深入分析外觀服務的加載過程。引導程序將在處理請求是完成引導啟動。 本文首發于 深入淺出 Laravel 的 Facade 外觀系統,轉載請注明出處。 今天我們將學習 Laravel 核心架構中的另一個主題「Fac...
摘要:服務提供者先看看定義服務提供者是所有應用程序啟動的中心所在。通過本文,希望大家能夠了解服務提供者,,和實際調用的類的實例之間的關系。 以 Laravel 自帶的文件系統為例,在 config/app.php 的配置文件的 providers 數組中,注冊了一個服務提供者: IlluminateFilesystemFilesystemServiceProvider::class, 在 a...
閱讀 2542·2021-10-11 10:58
閱讀 1020·2019-08-29 13:58
閱讀 1661·2019-08-26 13:32
閱讀 830·2019-08-26 10:40
閱讀 3256·2019-08-26 10:18
閱讀 1756·2019-08-23 14:18
閱讀 1106·2019-08-23 10:54
閱讀 435·2019-08-22 18:39