# 淺談Laravel中Service和Facade應用 ###### tags: `PHP` `Laravel 5.8` --- * **目的** 大型專案下,Laravel提供方便的架構類型,讓系統能更有效率(重複利用)、彈性(低耦合,替換方便)、效能(單例模式,有用到時再新增),本文為筆者對Service和Facade簡易使用心得分享XD (如果有任何不同的想法,也歡迎一起討論) * **前言** 軟體工程中,當一個專案規模越來越大時,要處理的邏輯也會相形複雜許多,也因此才會有各種設計模式,甚至框架的產生,以便攻城獅們能更有效率地應對萬變的情況XD。(當然如果其實不是很大的案子,用不是物件導向的開發方式,有時還會省力許多) 而在Laravel中,應付商業邏輯開發的部分,就已有許多方便的設計架構可讓開發人員使用,也就是本文以下會提及的Service、Facade。 * **Service** 其實從另外一個方面來看,使用方式就跟一般Class時一樣。但是透過Laravel的Service Container和Service Provider方式去使用時,能享有更多額外的優點: 1. 方便替換實作功能,當透過Binding Interfaces To Implementations的方式,可彈性抽換實作的物件,降低程式的修改幅度。(以下例子為在AppServiceProvider中register()去註冊)  並且可彈性切換綁定對象(假設為當某controller中客製化替換給A公司)  [官方說明](https://laravel.com/docs/5.8/container#binding-interfaces-to-implementations) 2. 方便用DI方式自動引用服務  假如為無法DI的地方(e.g. 非lavavel本身架構物件),也可以使用resolve()方式去取得透過抽象化的實例。  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的靜態方法一樣XD,但是同Service一樣,在Laravel中也能享有好處: 1. 同上,方便替換實作功能,透過註冊綁定方式,可彈性變更實作功能  2. 享有Service綁定功能方式(e.g. 上圖的Singleton方式) 題外話,筆者開發小心得,Facade在使用時,常有IDE無法解析可使用的方法,因此在自建的Facade時,可透過註解的方式,讓IDE可讀懂你的Facade!  --- * **結語** 由於筆者是這一年才開始使用Laravel(先前是Yii2),一開始看到Service和Facade的相關官方文件時,對於Laravel能提供低耦合高彈性的開發架構,覺得非常心有戚戚焉XD。可以方便解決以往開發時,客戶多變的需求,程式一改往往要改上好幾個地方,囧,但是在Laravel這邊如果能好好運用提供的架構模式開發時,就可以很單純的只修改一個地方XD,並且甚至可保有多種功能邏輯,彈性的應用在各種地方,實在是令人開心的消息啊。也不知道各位的想法是如何呢?歡迎一起分享討論XD * **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)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up