---
# System prepended metadata

title: 淺談Laravel中Service和Facade應用
tags: [PHP, Laravel 5.8]

---

# 淺談Laravel中Service和Facade應用

###### tags: `PHP` `Laravel 5.8`

---
* **目的**
大型專案下，Laravel提供方便的架構類型，讓系統能更有效率（重複利用）、彈性（低耦合，替換方便）、效能（單例模式，有用到時再新增），本文為筆者對Service和Facade簡易使用心得分享ＸＤ
(如果有任何不同的想法，也歡迎一起討論)


* **前言**
軟體工程中，當一個專案規模越來越大時，要處理的邏輯也會相形複雜許多，也因此才會有各種設計模式，甚至框架的產生，以便攻城獅們能更有效率地應對萬變的情況ＸＤ。（當然如果其實不是很大的案子，用不是物件導向的開發方式，有時還會省力許多）
而在Laravel中，應付商業邏輯開發的部分，就已有許多方便的設計架構可讓開發人員使用，也就是本文以下會提及的Service、Facade。


* **Service**
其實從另外一個方面來看，使用方式就跟一般Class時一樣。但是透過Laravel的Service Container和Service Provider方式去使用時，能享有更多額外的優點：
1. 方便替換實作功能，當透過Binding Interfaces To Implementations的方式，可彈性抽換實作的物件，降低程式的修改幅度。（以下例子為在AppServiceProvider中register()去註冊）
![](https://i.imgur.com/4DilxKd.png)
並且可彈性切換綁定對象（假設為當某controller中客製化替換給A公司）
![](https://i.imgur.com/L7MTFNb.png)
[官方說明](https://laravel.com/docs/5.8/container#binding-interfaces-to-implementations)

2. 方便用DI方式自動引用服務
![](https://i.imgur.com/y13ZkR2.png)
假如為無法DI的地方（e.g. 非lavavel本身架構物件），也可以使用resolve()方式去取得透過抽象化的實例。
![](https://i.imgur.com/PXql0JT.png)

3. 其他更多...(Contextual Binding、Tagging)，不過筆者目前仍為不是很熟悉，在此就先不多作闡述了！


* **Facade**
有時候，攻城獅們並不想每次很麻煩都要注入Service之類的步驟，想偷懶一點點（疑），就可以使用Facade的方式去處理商業邏輯。
這個其實源自一個Facade的設計模式（外觀模式，[維基百科在此](https://zh.wikipedia.org/wiki/%E5%A4%96%E8%A7%80%E6%A8%A1%E5%BC%8F)）。筆者應用起來，其實感覺蠻像使用以往Class的靜態方法一樣ＸＤ，但是同Service一樣，在Laravel中也能享有好處：
1. 同上，方便替換實作功能，透過註冊綁定方式，可彈性變更實作功能
 ![](https://i.imgur.com/hcLD1vH.png)
2. 享有Service綁定功能方式（e.g. 上圖的Singleton方式）
題外話，筆者開發小心得，Facade在使用時，常有IDE無法解析可使用的方法，因此在自建的Facade時，可透過註解的方式，讓IDE可讀懂你的Facade！
![](https://i.imgur.com/gszSxoc.png)


---
* **結語**
由於筆者是這一年才開始使用Laravel（先前是Yii2），一開始看到Service和Facade的相關官方文件時，對於Laravel能提供低耦合高彈性的開發架構，覺得非常心有戚戚焉ＸＤ。可以方便解決以往開發時，客戶多變的需求，程式一改往往要改上好幾個地方，囧，但是在Laravel這邊如果能好好運用提供的架構模式開發時，就可以很單純的只修改一個地方ＸＤ，並且甚至可保有多種功能邏輯，彈性的應用在各種地方，實在是令人開心的消息啊。也不知道各位的想法是如何呢？歡迎一起分享討論ＸＤ


* **References**
1. [建構自己的Facade](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/108554/)
2. [Service Container](https://laravel.com/docs/5.8/container)
3. [Service Provider](https://laravel.com/docs/5.8/providers)
4. [Facade](https://laravel.com/docs/5.8/facades)
