Laravel-5.1如何将当前登录用户注入到我的控制器中?

9

如何将当前登录的用户模型注入到我的控制器中?

例如,我的控制器中目前有:

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.');
}

我该如何实现这个?

你尝试使用用户ID作为第二个参数了吗?这可能会更简单。 - ArtisticPhoenix
4个回答

14

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.');
}

不需要注入任何东西,使用门面或查询数据库。
此外,如果您的属性标记为fillable,则可以只进行批量分配而无需为您的模型上的每个属性分配一个值。
$user = $request->user()->fill($request->except('password'));

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

$user->save();

9
自Laravel 5.0以来,类Illuminate\Contracts\Auth\Authenticatable可用于将当前登录的用户注入到从IOC容器中解析的控制器或类中。

1
这是对原问题的正确答案。 - chugadie
2
@chugadie - 你是指像这样吗?public function myAction(Authenticable $user) - kimsal

9

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

  1. Implement the provider

    //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. Register your provider

    //config/app.php
    'providers' => [
      //here go existing providers
      'App\Providers\CurrentUserServiceProvider'
    ]
    

你可以在这里找到更多细节:http://php.net/manual/zh/language.oop5.basic.php#language.oop5.basic.class.class - jedrzej.kurylo
1
在5.4版本中,您需要 return \Auth::user(); 注意 Auth 前面的反斜杠。 - kevnk

-1

L5你可以尝试使用Facade:

use Illuminate\Support\Facades\Auth;

a) 如果你仔细看,你会发现他已经在使用Facade模式了。b) 这个问题要求使用依赖注入,而不是反模式。 - MattWithoos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接