使用静态上下文(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中没有绑定。那么如何获得呢?
答案 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);
}
...但当然界面不能保证你得到的东西就像卫兵一样。只希望最好。