Используя статический контекст (фасады), работает следующий код:
$result = Auth::attempt(Input::only('email', 'password'));
Допустим, я хочу уменьшить статический контекст до минимума (что, как говорят, возможно с Laravel).
Я делаю небольшой компромисс и получаю ссылку на приложение:
/* @var $app Illuminate\Foundation\Application */
$app = App::make("app");
… затем получите менеджер авторизации:
/* @var $auth \Illuminate\Auth\AuthManager */
$auth = $app->get("auth");
Теперь проблема: AuthManager
не имеет attempt
метод. Guard
делает. Единственная проблема: у Guard нет привязки в IoC ontainer. Так как его получить?
Вы можете просто использовать Dependency Injection и получить его
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
это не статическая ссылка — это фасад, который создает экземпляр при обращении к нему. Таким образом, вы все еще можете проверить и т. Д. Но это обсуждение в другой раз 🙂
AuthManager
наследует driver()
метод из 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. Просто надейтесь на лучшее.