Laravel-5.1将当前登录的用户注入我的控制器

V4n*_*ll4 7 php laravel 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.');
}
Run Code Online (Sandbox Code Playgroud)

但不是这条线:

$user = User::findOrFail(Auth::user()->id);
Run Code Online (Sandbox Code Playgroud)

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.');
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Mar*_*ean 11

Request对象(以及反过来,任何形式的请求类)附带在用户当前登录:

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

    $user->first_name = $request->first_name;
    $user->last_name = $request->last_name;
    $user->email = $request->email;

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

    $user->save();

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

无需注入任何东西,使用façades或查询数据库.

此外,如果您的属性标记为可填充,则只需对其进行批量分配,而无需User单独为模型分配每个属性:

$user = $request->user()->fill($request->all());

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

$user->save();
Run Code Online (Sandbox Code Playgroud)


Log*_*ley 9

从 Laravel 5.0 开始,该类Illuminate\Contracts\Auth\Authenticatable可用于将当前登录的用户注入到从 ioc 容器解析的控制器或类中。

  • @chugadie - 你的意思是这样吗?公共函数 myAction(Authenticable $user) (2认同)

jed*_*ylo 7

为了注入当前用户,您需要实现一个简单的服务提供者.要实现这一目标,需要两个简单的步骤:

  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();  
        });
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 注册您的提供商

    //config/app.php
    'providers' => [
      //here go existing providers
      'App\Providers\CurrentUserServiceProvider'
    ]
    
    Run Code Online (Sandbox Code Playgroud)