如何获得没有外墙的卫兵(没有静电)

时间:2015-02-09 13:59:58

标签: php laravel laravel-4 non-static

使用静态上下文(Facade),以下代码可以工作:

$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 ontainer中没有绑定。那么如何获得呢?

2 个答案:

答案 0 :(得分: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'));
}

和p.s. Guard不是静态引用 - 它是一个在引用时创建实例的外观。所以你仍然可以测试等。但这是另一次的讨论:)

答案 1 :(得分:1)

AuthManager继承driver()的{​​{1}}方法,该方法将提供驱动程序实例(显然是Guard)。

Manager也使用magic将对不存在的函数的任何调用转发给驱动程序:

Manager

所以,回答我自己的问题:

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

...但当然界面不能保证你得到的东西就像卫兵一样。只希望最好。