Как получить Страж без фасадов (без статики)

Используя статический контекст (фасады), работает следующий код:

$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. Так как его получить?

0

Решение

Вы можете просто использовать 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 это не статическая ссылка — это фасад, который создает экземпляр при обращении к нему. Таким образом, вы все еще можете проверить и т. Д. Но это обсуждение в другой раз 🙂

1

Другие решения

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. Просто надейтесь на лучшее.

1

По вопросам рекламы [email protected]