2015-02-09 38 views
0

使用靜態背景下得到保護(門面)下面的代碼工作:如何不外牆(不帶靜電)

$result = Auth::attempt(Input::only('email', 'password')); 

比方說,我想,以減少靜態上下文到最小(這被認爲是可能的Laravel )。

我正在做一個小的妥協,並獲得了應用程序的引用:

/* @var $app Illuminate\Foundation\Application */ 
$app = App::make("app"); 

...然後拿到AUTH經理:

/* @var $auth \Illuminate\Auth\AuthManager */ 
$auth = $app->get("auth"); 

現在的問題:AuthManager已沒有attempt方法。 Guard呢。唯一的問題是:Guard在IoC容器中沒有約束力。那麼如何獲得它?

回答

1

AuthManager繼承Managerdriver()方法,這將給一個驅動程序實例(這顯然是國民警衛隊)的討論。

而且Manager使用魔法轉發給不存在的功能驅動程序的任何來電:

public function __call($method, $parameters) 
{ 
    return call_user_func_array(array($this->driver(), $method), $parameters); 
} 

因此,要回答自己的問題:

/* @var $manager \Illuminate\Auth\AuthManager */ 
$manager = $app->get("auth"); 

/* @var $guard \Illuminate\Auth\Guard */ 
$guard = $manager->driver(); 

...但當然的了界面並不能保證你得到的是類似Guard的東西。只希望最好。

1

你可以使用依賴注入,並得到它

use Illuminate\Auth\Guard as Auth; 

public $auth; 

public function __construct(Auth $auth) 
{ 
    $this->auth = $auth; 
} 

public function doSomething() 
{ 
    $this->auth->attempt(Input::only('email', 'password')); 
} 

和附: Guard不是一個靜態引用 - 它是一個在涉及時創建實例的外觀。所以,你仍然可以測試等,不過,這是另一個時間:)

+0

我是否需要在路由器中使用一些魔術來實現這個功能?如果我添加一個參數給我的構造函數,我得到'ReflectionException'消息'Class Illuminate \ Contracts \ Auth \ Guard does not exist',如果我將它添加到控制器方法中,我得到了'參數1傳遞給RpcController :: get ()必須是Illuminate \ Contracts \ Auth \ Guard的一個實例,沒有給出(我正在使用Laravel 4)。 – vbence 2015-02-09 14:42:57

+0

Whops - 對不起 - 我在想Laravel 5 – Laurence 2015-02-09 14:49:04

+0

回覆更新爲L4 – Laurence 2015-02-09 14:50:22