Как мне ввести пользователя, чтобы мне не приходилось искать его в запросе Laravel? - PullRequest
0 голосов
/ 27 июня 2018

Я следую учебному пособию по маршрутам, подписанным Laravel:

https://dev.to/fwartner/laravel-56---user-activation-with-signed-routes--notifications-oaa

Для создания подписанного маршрута автор делает следующее:

$url = URL::signedRoute('activate-email', ['user' => $this->user->id]);

обратите внимание, что «пользователю» он назначил только идентификатор ...

Позже, когда рассматриваемый пользователь нажимает на сгенерированную ссылку и другая часть кода делает это:

Route::get('/activate-email/{user}', function (Request $request) {
    if (!$request->hasValidSignature()) {
        abort(401, 'This link is not valid.');
    }

    $request->user()->update([
        'is_activated' => true
    ]);

    return 'Your account is now activated!';
})->name('activate-email');

Я смущен этой частью:

$request->user()->update([
    'is_activated' => true
]);

Автор обращается к пользователю () напрямую и запускает обновление для него?

Когда я в своем собственном коде попробовал это:

dd ($ request-> user ()) Я получил ноль, и если я попытался dd ($ request-> user) Я получил идентификационный номер пользователя.

Как автор может вызывать user () -> update, не ища пользователя. Я не вижу, куда он вводит объект User, поэтому мне кажется, что это волшебство, или, возможно, автор не полностью протестировал свой собственный код, который находится на GitHub: https://github.com/fwartner/laravel-user-activation

Так как мне ввести пользователя в маршрут, чтобы мне не пришлось явно искать его с помощью

$user = User::find($request->user);

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Существует разница между $request->user и $request->user()

$request->user() совпадает с auth()->user(), поэтому он получает аутентифицированного пользователя.

$request->user просто получает пользователя param в объекте запроса.

Если вы хотите получить пользователя напрямую, не отправляя запрос на извлечение его из базы данных, вы должны внедрить его непосредственно в маршрут (или метод) следующим образом (при условии, что ваша модель пользователя - User.php):

Route::get('/activate-email/{user}', function (User $user, Request $request) {
    if (!$request->hasValidSignature()) {
        abort(401, 'This link is not valid.');
    }

    $request->user()->update([
        'is_activated' => true
    ]);

    return 'Your account is now activated!';
})->name('activate-email');

Обратите внимание, что $user совпадает с {user} в маршруте (это автоматически сделает привязку модели)

0 голосов
/ 27 июня 2018

Метод user() определен для объекта Request. Смотрите API документы:

https://laravel.com/api/5.6/Illuminate/Http/Request.html#method_user

Если в вашем маршруте используется аутентификация, пользователь будет привязан к каждому запросу.

В качестве альтернативы, вы всегда можете использовать Auth фасад или auth помощник для доступа к пользователю:

Auth::user()
// or
auth()->user()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...