2015-08-08 21 views
6

Jak mogę wprowadzić bieżący zalogowany model użytkownika do kontrolera?Laravel-5.1 wstrzyknij bieżącego zalogowanego użytkownika do mojego kontrolera

Na przykład w moim kontroler Obecnie mam:

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

Ale zamiast tego wiersza:

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

Byłoby miło po prostu wstrzyknąć modelu User do mojego kontrolera, który ładuje w już zalogowanym użytkowniku, dzięki czemu mogłem zamiast tego:

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

Jak mogę to osiągnąć?

+0

próbowałeś za pomocą identyfikatora użytkownika, dla drugiego parametru, który jest prawdopodobnie znacznie łatwiejsze. – ArtisticPhoenix

+0

Nie jesteś pewien co masz na myśli? – V4n1ll4

Odpowiedz

9

Przedmiotem Request (a to z kolei, wszelkie zajęcia Formularz zapytania) pochodzi z aktualnie zalogowanego użytkownika:

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

Nie trzeba wstrzyknąć niczego, zastosowania fasad, lub zapytania do bazy danych.

Ponadto, jeśli atrybuty są oznaczone jako gotowe do wypełnienia można je po prostu masowo przypisać, bez konieczności przypisać każdą właściwość modelu User indywidualnie:

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

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

$user->save(); 
+1

Eleganckie rozwiązanie. –

5

aby mieć bieżący użytkownik wtryskiwana, ty” Muszę zaimplementować prostego dostawcę usług. Dwa proste kroki są potrzebne aby to osiągnąć:

  1. Wdrożenie dostawcy

    //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. Zarejestruj dostawca

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

Co robi część 'User :: class'? – V4n1ll4

+0

Jest to alias nazwy klasy przestrzeni nazw od PHP 5.5. Zamiast tego możesz podać ciąg znaków: –

+0

Więcej informacji znajdziesz tutaj http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.class –

0

Od laravel 5.0, klasa Illuminate\Contracts\Auth\Authenticatable puszka służy do wstrzykiwania aktualnie zalogowanego użytkownika int o kontroler lub klasa rozwiązana z kontenera ioc.

0

L5 można spróbować elewacji:

use Illuminate\Support\Facades\Auth; 
Powiązane problemy