當前位置:編程學習大全網 - 源碼下載 - 如何使用Laravel立面

如何使用Laravel立面

門面布局是面向對象編程中經常使用的壹種軟件設計布局方法。Facade實際上是壹個包含復雜函數庫的類,提供了壹個更加簡潔易讀的接口。門面布局還可以為壹組結構復雜、設計簡單的API提供統壹的、設計良好的API。

Laravel框架類似於這種布局,也稱為立面。在本教程中,我們將學習如何在其他框架中應用Laravel的“Facades”。在繼續之前,讓我們簡單看壹下Ioc容器。

首先,我們了解Laravel的立面內部工作結構。然後我們將討論如何轉換它並在其他環境中使用它。

拉勒維爾的立面

Laravel facade是壹個為容器的內部服務提供類似靜態接口的類。根據它的文檔,Facades是壹個可以觸及容器服務底層實現的代理。

然而,在PHP社區中,關於其名稱的爭論壹直不斷。有些人堅持要修改這個名字以避免開發者的困惑,因為它沒有完全實現門面布局。如果妳也為這個名字所困擾,妳可以為它取另壹個名字。但是,請註意,下面將使用的Laravel框架基類將被稱為Facade。

Laravel中的立面是如何實現的

如何在Laravel中實現立面

您可能知道,容器中的每個服務都有唯壹的名稱。在laravel應用中,可以使用App::make()方法或者App()輔助函數直接從容器中獲取服務。

& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)

app::make(' some _ service ')-& gt;方法名();

復制代碼

如前所述,Laravel使用facade類的好處在於,它讓開發者更容易使用服務。使用facade類後,下面的代碼可以達到同樣的效果:

// ...

someService::method name();

// ...

復制代碼

在Laravel中,所有服務都包含壹個facade類。這些facade類繼承自Illuminate/Support包中的Facade基類。他們只需要實現getFacadeAccessor方法,該方法返回容器中的服務名。

在上面的例子中,someService代表facade類。MethodName實際上是容器中原始服務的壹個方法。如果在Laravel的上下文之外看上面的例子,這意味著壹個名為someService的類導致了壹個名為methodName()的靜態方法。但這不是Laravel實現接口的方式。下壹節,我們將介紹Laravel的Facade基類是如何在幕後工作的。

基礎立面

Facade類包含壹個名為$app的私有屬性,其值是對服務容器的引用。如果要在Laravel之外使用facades,必須讓容器顯式使用setFacadeApplication()方法。

在facade基類內部,__callStatic magic方法用於處理實際上並不存在的靜態方法的調用。如果調用Laravel facade類的靜態方法,那麽__callStatic方法將被激活,因為facade類沒有實現它。因此,__callStatic會從容器中獲取自己的服務,然後調用它。

下面是facade基類中__callStatic方法的實現:

& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)

// ...

/**

*處理對對象的動態、靜態調用。

*

* @param string $method

* @param array $args

* @返回混合

*/

公共靜態函數__callStatic($method,$args)

{

$ instance = static::getFacadeRoot();

開關(count($args)) {

案例0:

返回$ instance-& gt;$ method();

案例1:

返回$ instance-& gt;$ method($ args[0]);

案例二:

返回$ instance-& gt;$method($args[0],$ args[1]);

案例三:

返回$ instance-& gt;$method($args[0],$args[1],$ args[2]);

案例4:

返回$ instance-& gt;$method($args[0],$args[1],$args[2],$ args[3]);

默認值:

返回call _ user _ func _ array([$ instance,$method],$ args);

}

}

復制代碼

在上面的方法中,getFacadeRoot()從容器中獲取服務。

外觀類分析

每個外觀類都繼承自基類。我們只需要實現getFacadeAccessor()方法,該方法用於返回容器中的服務名。

& lt?php命名空間App \ Facades

使用照明\支撐\立面\立面作為BaseFacade

SomeServiceFacade類擴展BaseFacade {

/**

*獲取組件的註冊名稱。

*

* @返回字符串

*/

受保護的靜態函數getFacadeAccessor(){ return ' some . service ';}

}

復制代碼

另壹個名字

由於Laravel facades是PHP類,我們必須在使用它們之前導入它們。PHP支持名稱空間和自動導入,所以這些類可以通過調用完全限定名來自動加載。PHP還支持使用use指令給類起別名:

使用App\Facades\SomeServiceFacade

SomeServiceFacade:some method();

復制代碼

但是,當需要壹個特定的facade類時,我們必須在每個腳本文件中編寫壹次上面的代碼。Laravel在處理門面別名時有自己獨特的方法——別名加載器。

Laravel如何別名Facades?

所有別名都保存在app.php配置文件的別名數組中,該文件保存在/config目錄中。

查看數組,您會發現每個別名都對應壹個完全限定的類名。這意味著我們可以為facade類選擇任何名稱。

// ..

別名' = & gt[

// ...

' FancyName ' = & gt' App\Facades\SomeServiceFacade ',

],

復制代碼

現在,讓我們看看Laravel如何使用這個數組來別名facade類。在引導階段,Laravel將使用Illuminate\Foundation包中的AliasLoader服務。AliasLoader將別名數組作為參數,遍歷其所有元素,並使用PHP的spl_autoload_register創建__autoload函數隊列。每個__autoload函數將使用PHP的class_alias函數為每個facade類創建別名。

因此,我們不需要像使用use指令時那樣,在使用之前導入該類並為其創建別名。當我們試圖使用壹個不存在的類時,PHP將檢查__autoload隊列以獲取適當的自動加載器。至此,AliasLoader已經寫下了所有的__autoload函數。每個自動加載器將選擇壹個類名,並根據別名數組推導出相應的初始類名。最後,它將為它創建壹個別名。請參考下面的方法調用:

& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)

// FancyName根據別名數組解析為App\Facades\SomeServiceFacade

FancyName::someMethod()

復制代碼

在後臺,FancyName將被映射到app \ facades \ Somerservicefacade。

在其他框架中使用外觀

現在我們知道了Laravel如何處理facade和別名,我們可以將Laravel的facade方法應用到其他環境中。接下來,我們將在Silex框架中使用facades。但是,只要遵循同樣的思路,也可以在其他框架中使用。

Silex有壹個繼承自Pimple的容器。使用$app對象調用容器中的服務:

& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)

$ app[' some . service ']-& gt;someMethod()

復制代碼

使用facade類,我們可以為Silex服務提供壹個準靜態接口。此外,我們還可以使用AliasLoader服務為這些立面創建有意義的別名。因此,我們可以重新組織上面的代碼:

& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)

SomeService::some method();

復制代碼

必要條件

為了使用facade基類,我們需要使用composer指令安裝Illuminate\Support包:

作曲家需要照明\支持

該套餐還包含其他服務。但是目前我們只需要facade基類。

創建外觀

只需繼承facade基類並實現getFacadeAccessor方法來為服務創建壹個Facade。

在本文中,所有的立面都將保存在src/Facades路徑中。例如,名為some.service的服務的外觀類如下:

& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)

命名空間應用程序\外觀

使用照明\支撐\立面\立面;

SomeServiceFacade類擴展了Facade {

/**

*獲取組件的註冊名稱。

*

* @返回字符串

*/

受保護的靜態函數getFacadeAccessor(){ return ' some . service ';}

}

復制代碼

請註意,該類位於app\facades命名空間下。

現在只剩下設置facade類的應用容器了。如前所述,在靜態上下文中調用facade類的方法會觸發__callStatic方法。該方法將使用getFacadeAccessor()返回的數據識別容器中的服務,並嘗試獲取它。在Laravel外部使用facade基類時,容器對象不是自動設置的,需要手動設置。

為此,可以通過使用facade基類的setFacadeApplication方法來設置facade類的應用程序容器。

在app.php文件中,添加以下代碼:

& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)

illumiante \ Support \ Facade::setFacadeApplication($ app);

復制代碼

這將為所有從facade基類繼承的facade設置容器。

現在,我們可以使用剛剛創建的facade類,而不是直接從容器中獲取服務,這也允許我們調用靜態上下文中的所有方法。

實現別名

為了創建facade類的別名,我們將使用前面介紹的AliasLoader。AliasLoader類由illuminate\foundation包提供。您可以下載整個包或復制部分代碼並將其保存為文件。

如果要復制源文件,建議保存在src/Facades目錄下。您可以根據項目的結構為AliasLoader類創建壹個名稱空間。

在本例中,我們將復制代碼並將其保存在app/facades名稱空間中。

創建別名數組

在config目錄中創建壹個aliases.php文件,並填寫alias-facade綁定:

& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)

返回[

' FancyName ' = & gt' App\Facades\SomeService ',

];

復制代碼

FancyName是我們為App\Facades\SomeService創建的別名。

註冊別名

AliasLoader是壹個單例服務。要創建或獲取別名加載器的實例,您需要調用getInstance方法,並將別名數組作為參數。最後,為了註冊這些別名,您需要調用它們的register方法。

再次打開app.php文件,並添加以下代碼:

& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)

// ...

$aliases = require __DIR__。'/../../config/aliases . PHP ';

app \ Facades \ alias loader::getInstance($ aliases)-& gt;寄存器();

復制代碼

現在,妳完成了!我們可以按如下方式使用該服務:

& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)

fancy name::method name();

復制代碼

進行包裝

Facade類只需要實現getFacadeAccessor方法,該方法返回容器中的服務名。要在Laravel環境之外使用facade,必須使用setFacadeApplication()方法顯式設置服務容器。

為了引用facade類,我們可以通過使用完全限定的類名或使用PHP的use指令來導入它。或者,遵循Laravel為立面創建別名的方法,使用alias loader。

原文鏈接:/how-laravel-facades-work-and-how-use-them-where/(作者:Reza Lavaryan)本文由OneAPM工程師編譯。

OneAPM for PHP可以深入所有PHP應用完成應用性能管理,可以深入所有PHP應用完成應用性能管理和監控,包括代碼級性能問題的可見性、性能瓶頸的快速識別和追溯、真實用戶體驗監控、服務器監控和端到端應用性能管理。要閱讀更多技術文章,請訪問OneAPM的官方技術博客。

本文轉自OneAPM官方博客。

  • 上一篇:Asp全屏網站源代碼
  • 下一篇:JSP適合做大型網站,為什麽百度主頁還是PHP寫
  • copyright 2024編程學習大全網