Как получить вошедшего в систему пользователя

Источник: «How to Get the Logged In User in Laravel»
Прочтите о разных подходах, которые можно использовать для получения аутентифицированного пользователя в Laravel проектах. В этой статье рассматривается результат проведённого в Twitter опроса.

Введение

Как фрилансер веб-разработчик Laravel я получаю возможность работать над самыми разными проектами. Эти проекты варьируются от небольших приложений до крупных приложений корпоративного масштаба и даже проектов с открытым исходным кодом. Так что я вижу много разных кодовых баз и вижу, как разные команды решают проблемы.

Есть одна вещь, которую я вижу почти в каждом приложении, и это получение аутентифицированного пользователя в контроллере или классе запроса. Единого способа сделать это не, и я видел много разных подходов.

Из чистого любопытства я провёл опрос в Twitter, чтобы спросить Laravel разработчиков, как они получают аутентифицированного пользователя в своих приложениях. Я получил 137 ответов, поэтому подумал, что было бы интересно поделиться результатами в этой статье, чтобы вы могли увидеть, как это делают другие разработчики.

Опрос

Результат опроса

Голоса были следующими:

Анализ

auth()->user()

Согласно опросу, самый популярный способ получить аутентифицированного пользователя в Laravel — использовать хелпер auth()->user().

Из прочтения причин лежащих в основе этого выбора, кажется, что он был популярен, потому что не требует импорта каких-либо классов в ваш код, таких как фасад Auth или класс Request. Вместо этого вы можете просто использовать хелпер auth() непосредственно коде, для получения аутентифицированного пользователя.

Например, в контроллере вы можете сделать следующее:

class UserController extends Controller
{
public function show()
{
$user = auth()->user();

return view('user.show', ['user' => $user]);
}
}

Кто-то может возразить, что использование этого подхода является плохой практикой, поскольку при этом используется глобальный хелпер. Обычно я согласен с этим мнением, потому что мне нравиться избегать использования хелперов, когда это возможно, и вместо них использовать методы классов. Однако в этом случае мне очень нравиться использовать хелпер auth(). Он короткий, простой и легко запоминающийся. Я заметил, что он используется почти в каждом проекте Laravel, над которым я когда-либо работал. Так как это довольно распространённый подход, и мне нравиться придерживаться соглашений, которые команды уже используют.

Основная опасность, которую я вижу (и видел много раз) в этом подходе, заключается в том, что заманчиво использовать его вне контроллеров и классов запросов. Предположим, что у нас есть action или сервисный класс обновляющий сведения о вошедшем в систему пользователе. Код может выглядеть так:

class UpdateUserDetailsAction
{
public function execute(array $data)
{
$user = auth()->user();

$user->update($data);

// ...
}
}

В этом случае мы используем хелпер auth() для обновления сведений о пользователе. Но сделав это, мы связали наш action класс с аутентификацией. Это означает, что если бы мы захотели использовать этот action класс в другом контексте (например, для обновления сведений о другом пользователе), то не смогли бы сделать это с текущей реализацией.

Action класс можно было бы улучшить, передав пользователя методу, например так:

class UpdateUserDetailsAction
{
public function execute(User $user, array $data)
{
$user->update($data);

// ...
}
}

Это означает, что теперь мы можем вызвать метод action класса следующим образом:

(new UpdateUserDetailsAction)->execute(
user: auth()->user(),
data: ['name' => 'Ash Allen']
);

Так что, по моему мнению, если вы помните об использовании хелпера auth() только в контроллерах и классах запросов, то это совершенно прекрасный подход к использованию.

$request->user()

Второй по популярности способ получить аутентифицированного пользователя в Laravel — использовать метод $request->user().

Мне этот подход нравится больше всего. Как я уже упоминал, мне нравиться избегать глобальных вспомогательных функций (хелперов), когда это возможно. Поэтому мне нравиться, что в этом подходе вместо них используется метод класса Request. Я также чувствую, что он довольно хорошо читается и затрудняет случайное использование вне контроллеров и классов запросов (если вы не решите получить к нему доступ с помощью функции request()->user()).

Например, в контроллере можно сделать следующее:

use Illuminate\Http\Request;

class UserController extends Controller
{
public function show(Request $request)
{
$user = $request->user();

return view('user.show', ['user' => $user]);
}
}

Возможно вы заметили, что этот подход также требует импорта класса Request в контроллер.

Auth::user()

Третий по популярности способ получить аутентифицированного пользователя в Laravel — использовать метод Auth::user().

Я никогда раньше не использовал этот подход в собственном коде, потому что всегда выбирал методы auth()->user() или $request->user(). Тем не менее я понимаю, почему некоторые разработчики могут предпочесть этот подход. Он выглядит по-ларавельски с использованием фасада Auth.

Например, в контроллере можно сделать следующее:

use Illuminate\Support\Facades\Auth;

class UserController extends Controller
{
public function show()
{
$user = Auth::user();

return view('user.show', ['user' => $user]);
}
}

Другие подходы

Было также несколько других подходов упомянутых в опросе. К ним относится создание собственных хелперов (таких, как authUser()), использование внедрения зависимостей для разрешения пользователя из интерфейса, и использование хелпера request()->user().

Хотя эти подходы не были так популярны, как упомянутые выше. Думаю, что их всё же стоит упомянуть, потому что вы можете столкнуться с ними при работе над Laravel проектом.

Важно помнить, что эти результаты ни в коем случае не являются представлением всего Laravel сообщества. Опрос был открыт всего на 24 часы и был только в Twitter. Есть вероятность, что эти результаты могут быть смещены в сторону определённого типа разработчиков. Но я всё же думаю, что они дают хорошее представление о подходах, которые вы увидите в разных проектах, даже если цифры не на 100% точны.

Заключение

Надеюсь эта статья дала вам представление о разных способах получения аутентифицированного пользователя в Laravel.

Дополнительные материалы

Предыдущая Статья

Новое в Symfony 6.3 — Интеграция Webhook с Mailer и Notifier

Следующая Статья

Проходя мимо Action классов в Laravel