2015-08-08 13 views
6

Come posso iniettare il modello utente attualmente connesso al mio controller?Laravel-5.1 inietta l'utente attualmente connesso al mio controller

Ad esempio, nel mio controller attualmente ho:

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

Ma invece di avere questa linea:

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

Sarebbe bello solo per iniettare il modello di User nel mio controller che carica nell'utente già registrato, in modo che potessi usarci questo:

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

Come posso ottenere questo risultato?

+0

Hai provato a usare l'ID utente, per il secondo parametro che probabilmente è molto più facile. – ArtisticPhoenix

+0

Non sei sicuro di cosa intendi? – V4n1ll4

risposta

9

L'oggetto Request (e, a sua volta, tutte le classi di richiesta modulo) viene fornito con l'utente attualmente connesso:

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

Non c'è bisogno di iniettare qualsiasi cosa, uso facciate, o interrogare il database.

Inoltre, se i vostri attributi sono contrassegnati come compilabile si potrebbe semplicemente mass-assegnare, senza dover assegnare ogni proprietà del modello User singolarmente:

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

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

$user->save(); 
+1

Soluzione elegante. –

5

Per aver utente corrente iniettata, è' Ho bisogno di implementare un semplice fornitore di servizi. Sono necessari due semplici passaggi per raggiungere questo:

  1. Implementare il 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. Pubblica il tuo fornitore di

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

Cosa fa la parte 'Utente :: classe'? – V4n1ll4

+0

È un alias del nome classe dello spazio dei nomi da PHP 5.5. Puoi passare una stringa invece –

+0

Puoi trovare maggiori dettagli qui http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.class –

0

Dal laravel 5.0, la classe Illuminate\Contracts\Auth\Authenticatable può essere utilizzato per iniettare l'utente attualmente connesso int o il controller o la classe viene risolta dal contenitore ioc.

0

L5 si può provare Facciata:

use Illuminate\Support\Facades\Auth; 
Problemi correlati