2015-08-08 78 views
6

如何将当前登录的用户模型注入到我的控制器中?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.'); 
} 

我该如何做到这一点?

+0

你试图使用用户ID,因为这可能是更容易的第二个参数。 – ArtisticPhoenix

+0

不确定你的意思? – V4n1ll4

回答

9

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

无需注入任何事情,使用外墙,或查询数据库。

另外,如果你的属性被标记为可填写你可能只是大众给它们,而不必每个属性您User单独的模型分配:

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

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

$user->save(); 
+1

优雅的解决方案。 –

5

才能有当前用户的注入,你”你需要实现一个简单的服务提供者。需要两个简单的步骤来实现的是:

  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' 
    ] 
    
+0

'User :: class'部分是做什么的? – V4n1ll4

+0

自PHP 5.5以来,它是命名空间类名的别名。你可以传递一个字符串 –

+0

你可以在这里找到更多的细节http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.class –

0

由于laravel 5.0,类Illuminate\Contracts\Auth\Authenticatable能用于注入当前登录的用户int o从ioc容器解析的控制器或类。

0

L5可以尝试门面:

use Illuminate\Support\Facades\Auth; 
相关问题