2014-06-26 41 views
1

大多數情況下,我都會在門面背後獲得想法,以及實例化對象的細節如何隱藏在靜態調用後面。麻煩了解Laravel的門面

因此,如果我們看看這個簡單的例子在這裏:Example

我們看到這樣一些代碼的門面,它在這一點上只設置了某種形式的別名。在這一點上,看起來門面仍然對類別Superuser一無所知。

class SuperuserFacade extends Facade 
{ 
    protected static function getFacadeAccessor() { 
     return 'MyAlias'; 
    } 
} 

的邏輯由服務提供商粘在這裏似乎:

class SuperuserServiceProvider extends ServiceProvider 
{ 
    public function register() { 
     App::bind('MyAlias', function(){ 
      return new Superuser; 
     }); 
    } 
} 

,但它只是結合類的門面別名MyAlias。爲什麼要打擾這個門面類和兩個單獨的文件,我們不能僅僅在服務提供者中完成所有這些邏輯嗎?或者,也可以在正面提供商那裏返回Superuser課程?

看起來好像我們的門面沒有真正做任何事情,然後另一個文件告訴門面做什麼。爲什麼這些擔憂是分開的?

回答

1

Facade類是一個簡單的代理 - 它將任何對Facade類的調用引導到根類,該類根據IoC容器通過Facade存取器(本例中爲MyAlias)檢索到。

  1. 我打電話Superuser::whoami()

  2. 超級用戶門面去「沒關係,我需要找到我的代理類。」

  3. 外觀調用getFacadeAccessor()來確定要檢索和隨後調用的IoC綁定。

  4. Facade請求IoC容器中的MyAlias密鑰。如果已經創建了容器,容器會返回一個已存在的類,或者它會運行綁定的閉包,該閉包會生成一個新的實例Superuser

  5. 既然門面知道它傳遞的是什麼類,它將whoami()方法調用轉發給新返回的Superuser實例,然後該實例返回它設計的任何內容。

服務提供商的register()方法簡單地註冊一個結合IoC容器中,待通過任何需要它以後檢索。而已。 MyAlias是一個簡單的字符串鍵,用於查找綁定。

Facade允許您像使用靜態類一樣使用IoC綁定類。

我推薦閱讀關於這個概念的其他文章,因爲你鏈接的文章既不準確也不是非常有用的信息爲什麼事情有效。 Here is a better article by Chris Fidao

+0

我得到了掛鉤它的邏輯,但爲什麼要將它分開,爲什麼不只是讓Facade返回'返回新的超級用戶;'而不是讓它返回別名'MyAlias'? – Rob

+0

@Rob因爲外觀只是代理或指針,現有的項目。它不應該創建一個新的對象,只需要調用一個現有的對象。 –