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