Что происходит «под капотом» при вызове Laravel: Auth::user()->id?
Пытаюсь разобраться с ларавел. Настроен крайне позитивно. Стоически подавляю желание написать весь проект на богопротивном codeigniter за два дня.
Мозги пухнут от фасадов, сервис-провайдеров и прочей х…..прогрессивной штуки. Есть ощущение, что мне это не дано, но попробовать хочется.
Итак, Laravel: Auth::user()->id . Все советуют : пишите так и обрящете id пользователя. Но хотелось бы понять откуда что берется. На первый взгляд вызывается статический метод user() класса Auth, который возвращает некий объект у которого есть свойство id. На второй взгляд Auth это фасад. Хорошо, не витрина. Ок , пытаемся понять откуда все-таки берется метод user() и свойство id.
Открываем vendor\laravel\framework\src\Illuminate\Support\Facades\Auth.php
protected static function getFacadeAccessor()
{
return 'auth';
}
идем в vendor\laravel\framework\src\Illuminate\Auth находим в нем сервис провайдер (опять страшные словечки!)
vendor\laravel\framework\src\Illuminate\Auth\AuthServiceProvider.php
в нем метод register()
видим такого зверя - $this->registerAuthenticator();
protected function registerAuthenticator()
{
$this->app->singleton('auth', function ($app) {
$app['auth.loaded'] = true;
return new AuthManager($app);
});
значит AuthManager это класс, который нам нужен. Это также , гласит таблица соответствий фасадов Laravel и классов, лежащих в их основе. Illuminate\Auth\AuthManager - auth
Но, как оказалось, класс AuthManager не предоставляет метод user() .. , ничего подобного. Никакого метода user() там нет. Так откуда берется пресловутый user() . Что за объект он нам возвращает ? Сколько еще ползать по коду , чтобы понять что к чему?
У вас отличный показательный пример, что когда модно и много умных словечек не всегда значит хорошо. Особенно, если ещё и непонятно, то совсем плохо. Наверное, лучше решить задачу за 2 дня на простом и понятном CodeIgniter?) Хотя разочек попробовать вы сами должны, чтобы убедиться)
evnuh: хотя , пожалуй,это не мой случай. чтобы применять инструментарий по назначению - его нужно знать. А как его можно узнать? Только разобравшись что он из себя представляет. Вот как раз на этой стадии я сейчас и нахожусь.
AuthManager управляет драйверами (guard), которые и предоставляют метод user(). Найдите в менеджере метод __call и увидите, что он проксирует вызовы несуществующих методов в драйвер.