Laravel-5.1 внедряет текущего вошедшего в систему пользователя в мой контроллер

Как я могу внедрить текущую пользовательскую модель, вошедшую в систему, в мой контроллер?

Например, в моем контроллере у меня сейчас есть:

public function update(SaveAccountRequest $request)
{
    $user = User::findOrFail(Auth::user()->id);

    $user->first_name = $request->get('first_name');
    $user->last_name = $request->get('last_name');
    $user->email = $request->get('email');

    if($request->has('password')) {
        $user->password = Hash::make($request->get('password'));
    }

    $user->save();

    return redirect('/admin/account')->with('success', 'Your details have been saved.');
}

Но вместо этой строки:

$user = User::findOrFail(Auth::user()->id);

Было бы неплохо просто внедрить модель User в мой контроллер, который загружает уже вошедшего в систему пользователя, чтобы вместо этого я мог использовать это:

public function update(SaveAccountRequest $request, User $user)
{
    $user->first_name = $request->get('first_name');
    $user->last_name = $request->get('last_name');
    $user->email = $request->get('email');

    if($request->has('password')) {
        $user->password = Hash::make($request->get('password'));
    }

    $user->save();

    return redirect('/admin/account')->with('success', 'Your details have been saved.');
}

Как я могу этого добиться?


person V4n1ll4    schedule 08.08.2015    source источник
comment
Вы пытались использовать идентификатор пользователя для второго параметра, который, вероятно, намного проще.   -  person ArtisticPhoenix    schedule 08.08.2015


Ответы (4)


Объект Request (и, в свою очередь, любые классы запроса формы) имеют доступ к текущему аутентифицированному пользователю:

public function update(SaveAccountRequest $request)
{
    $user = $request->user();

    $user->first_name = $request->input('first_name');
    $user->last_name = $request->input('last_name');
    $user->email = $request->input('email');

    if ($request->has('password')) {
        $user->password = bcrypt($request->input('password'));
    }

    $user->save();

    return redirect('/admin/account')->with('success', 'Your details have been saved.');
}

Не нужно ничего вводить, использовать фасады или запрашивать базу данных.

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

$user = $request->user()->fill($request->except('password'));

if ($request->has('password')) {
    $user->password = bcrypt($request->input('password'));
}

$user->save();
person Martin Bean    schedule 08.08.2015

Чтобы внедрить текущего пользователя, вам нужно реализовать простого поставщика услуг. Для этого необходимо выполнить два простых шага:

  1. Реализовать поставщика

    //app/Providers/CurrentUserServiceProvider.php
    <?php namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    
    class CurrentUserServiceProvider extends ServiceProvider
    {
      public function register() 
      {
        $this->app->bind(User::class, function ($app) {
          return Auth::user();  
        });
      }
    }
    
  2. Зарегистрируйте своего провайдера

    //config/app.php
    'providers' => [
      //here go existing providers
      'App\Providers\CurrentUserServiceProvider'
    ]
    
person jedrzej.kurylo    schedule 08.08.2015
comment
Вы можете найти более подробную информацию здесь php. сеть/руководство/ru/ - person jedrzej.kurylo; 09.08.2015
comment
В 5.4 вам нужно return \Auth::user(); Обратите внимание на \, предшествующий Auth - person kevnk; 01.06.2017

Начиная с laravel 5.0, класс Illuminate\Contracts\Auth\Authenticatable можно использовать для внедрения вошедшего в систему пользователя в контроллер или класс, разрешаемый из контейнера ioc.

person Logan Bailey    schedule 22.12.2016
comment
это правильный ответ на исходный вопрос. - person chugadie; 25.02.2020
comment
@chugadie - ты имеешь в виду вот так? публичная функция myAction (Authenticable $user) - person kimsal; 26.02.2020

L5 вы можете попробовать Facade:

use Illuminate\Support\Facades\Auth;
person Dmitry Matrosov    schedule 09.08.2017
comment
а) Если вы посмотрите, то увидите, что он уже использует Фасад. б) вопрос требует инъекции зависимостей, а не анти-шаблона. - person MattWithoos; 07.01.2020