Как получить вошедшего в систему пользователя
Введение
Как фрилансер веб-разработчик Laravel я получаю возможность работать над самыми разными проектами. Эти проекты варьируются от небольших приложений до крупных приложений корпоративного масштаба и даже проектов с открытым исходным кодом. Так что я вижу много разных кодовых баз и вижу, как разные команды решают проблемы.
Есть одна вещь, которую я вижу почти в каждом приложении, и это получение аутентифицированного пользователя в контроллере или классе запроса. Единого способа сделать это не, и я видел много разных подходов.
Из чистого любопытства я провёл опрос в Twitter, чтобы спросить Laravel разработчиков, как они получают аутентифицированного пользователя в своих приложениях. Я получил 137 ответов, поэтому подумал, что было бы интересно поделиться результатами в этой статье, чтобы вы могли увидеть, как это делают другие разработчики.
Опрос
How do you get your current logged in user in your Laravel apps?
— Ash Allen 🚀 (@AshAllenDesign) April 21, 2023
I like using Option A! 😄#laravel #php pic.twitter.com/1ZJZlVnuo8
Результат опроса
Голоса были следующими:
auth()->user()
— 60 голосов (44%)$request->user()
— 39 голосов (28%)Auth::user()
— 29 голосов (21%)- Другое — 9 голосов (7%)
Анализ
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.