2015-08-08 15 views
6

Wie kann ich das aktuell angemeldete Benutzermodell meinem Controller injizieren?Laravel-5.1 injiziere den aktuell angemeldeten Benutzer zu meinem Controller

Zum Beispiel in meinem Controller habe ich zur Zeit:

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

Aber anstatt mit dieser Linie:

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

Es wäre nur schön sein, das User Modell in meinen Controller zu injizieren, die Lasten in dem bereits eingeloggten Benutzer, so dass ich uns das stattdessen ansehen könnte:

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

Wie kann ich das erreichen?

+0

haben Sie versucht, den Benutzer-ID verwenden, für den zweiten Parameter, der wahrscheinlich ist viel einfacher. – ArtisticPhoenix

+0

Nicht sicher, was du meinst? – V4n1ll4

Antwort

9

Das Request Objekt (und wiederum jegliche Form Anforderungsklassen) kommen mit dem aktuell angemeldeten Benutzer:

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

keine Notwendigkeit, jede Sache, die Verwendung Fassaden, zu injizieren oder die Datenbank abfragen.

Auch wenn Ihre Attribute werden als ausfüllbare markiert könnten Sie einfach Massen ordnen sie, ohne jede Eigenschaft auf Ihrem User Modell individuell zuweisen:

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

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

$user->save(); 
+1

Elegante Lösung. –

5

Um aktuelle Benutzer injiziert zu haben, Sie‘ Ich muss einen einfachen Dienstanbieter implementieren. Zwei einfache Schritte das erreichen benötigt:

  1. den Anbieter implementieren

    //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. Registrieren Anbieter

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

Was macht der 'User :: class' Teil? – V4n1ll4

+0

Es ist ein Alias ​​für Namespace-Klassenname seit PHP 5.5. Sie können stattdessen eine Zeichenfolge übergeben –

+0

Sie finden weitere Details hier http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.class –

0

Seit Laravel 5.0, die Klasse Illuminate\Contracts\Auth\Authenticatable kann verwendet werden, um den aktuell angemeldeten Benutzer int zu injizieren o der Controller oder die Klasse, die aus dem IOC-Container aufgelöst wird.

0

L5 können Sie Fassade versuchen:

use Illuminate\Support\Facades\Auth; 
Verwandte Themen