2016-12-21 3 views
3

In allen meinen Ansichten kann ich bereits standardmäßig auf {{Auth::user()->name}} zugreifen, ich versuche die Möglichkeit hinzuzufügen, in meinen Ansichten auch auf {{Profile::user()->...}} zuzugreifen, aber ich habe einige Probleme. Ich möchte nicht wirklich View-Composer verwenden, wenn ich nicht als this post suggests haben muss, weil es so aussieht, als müsste ich jede View manuell auflisten. Stattdessen entschied ich mich für die AppServiceProvider boot method, die in der Dokumentation aufgeführt ist. Das Problem ist, dass ich zum Beispiel immer noch nicht {{ Profile::user()->title }} anrufen kann. Ich bin den folgenden Fehler erhalten:Laravel Zugangsdaten aus allen Ansichten

ErrorException in AppServiceProvider.php line 19: 
Non-static method App\Profile::user() should not be called statically, assuming $this from incompatible context 

Hier ist meine AppServiceProvider.php

<?php 

namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 
use View; 
use App\Profile; 

class AppServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap any application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     // 
     View::share('user', Profile::user()); 
    } 

    /** 
    * Register any application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     // 
    } 
} 

Hier ist mein Modell profile.php

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Profile extends Model 
{ 
    // 
    protected $fillable = [ 
     'bio', 
     'linkedin_url', 
     'facebook_url', 
     'twitter_username', 
     'title', 
     'profile_image', 
     'user_id', 
    ]; 
    public function user() 
    { 
     return $this->belongsTo('user'); 
    } 
} 

Was bin ich falsch machen? Wie kann ich in allen Ansichten auf Benutzerprofildaten zugreifen? Kann ich ein Beispiel sehen?

+0

Wollen Sie das Profil des eingeloggten Benutzers? –

+2

Hat das Benutzermodell die Beziehung zu Profil? Sie können dann {{Auth :: user() -> profile-> myAttribute}} verwenden – Mei

Antwort

1

Sie müssen diese Variable nicht freigeben, da Sie nur das Profil des Benutzers abrufen möchten (Sie haben immer Benutzerdaten geladen) und es ist eine Eins-zu-Eins-Beziehung. Fügen Sie einfach die richtige Beziehung:

public function profile() 
{ 
    return $this->hasOne('\App\Profile'); 
} 

Und es dann in der App verwenden überall:

auth()->user()->profile->city 

Wenn Sie die Variable teilen werde, werden Sie zweite Abfrage auf alle Ansichten und in der realen App hinzufügen das willst du absolut nicht.

+1

Dies ist derjenige, der mich bekam, was ich brauchte, vielen Dank – Derek

1

Entsprechend Ihrem Code rufen Sie eine nicht statische Methode statisch auf. Du solltest das nicht tun. Stattdessen sollten Sie ein Profil verwenden, für die Sie einen bestimmten Benutzer wie diese wollen:

View::share('user', Profile::find(1)->user); 

Sie können auch alle Benutzer mit Profil ähnlichen & Ihre Modellen erhalten soll wie folgt aussehen:

class User extends Model { 

    public function profile() { 
     return $this->hasOne(Profile::class); 
    } 

} 

class Profile extends Model { 

    public function user() { 
     return $this->belongsTo(User::class); 
    } 

} 

View::share('user', User::with('profile')->get()); // <----- Get all users with profile 

oder wenn Sie das Profil des authentifizierten Benutzer erhalten möchten, können Sie es wie folgt tun:

View::share('user', auth()->user); // <---- Gets the authenticated User 
View::share('user_profile', auth()->user()->profile); // <---- Gets the authenticated User's profile 

hoffe, das hilft!

+0

Wenn ich versuche, 'View :: share ('user_profile', auth() -> Benutzer-> Profil);' im Boot Methode bekomme ich den folgenden Fehler: 'Undefined Eigenschaft: Illuminate \ Auth \ AuthManager :: $ user' – Derek

+0

Verwenden Sie' auth() -> Benutzer() -> Profil 'stattdessen habe ich die Antwort aktualisiert ... –

+0

Vielen Dank , jetzt bekomme ich den folgenden Fehler: 'Ich versuche, die Eigenschaft von non-object zu erhalten. Ich nehme an, es ist der' profile' Teil von 'View :: share ('user_profile', auth() -> user() -> profile) ; 'Ich habe sichergestellt, dass mein Profilmodell eine Benutzermethode hat und das Benutzermodell eine Profilmethode hat, wie in obigem Beispiel. – Derek

1

Wenn Sie View::share('user', Profile::user()); Ihr Profil Benutzer als {{ $user }} in der Ansicht verfügbar sein würde :)

Und ja die Fehlermeldung Sie ist erhalten, weil der Grund Saumya Rastogi geschrieben hat, dass Sie den Benutzer erhalten müssen für ein spezifisches Profil :)

1

Sowohl @Saumya als auch @Martdilling sind korrekt; Sie sind an die $user Variable in dem Dienstanbieter gebunden, den Sie verwenden. Sie müssen nur Ihre user() Methode statisch machen, darauf zuzugreifen, wie Sie wollen:

public static function user(){ 
    if (auth()->user()) return auth()->user()->profile; 
} 

Wenn Sie das, dann brauchen Sie nicht die Ansicht verbindlich, wenn Sie es nicht wollen. Sie können einfach {{ Profile::user() }} in einer beliebigen Blade-Vorlage verwenden. Aber das ist auch irgendwie albern, weil Sie jetzt den Namen Ihrer Beziehungsmethode überschrieben haben.

Wenn Sie wirklich super einfachen Zugriff auf das Profil des aktuellen Benutzers wollen, warum nicht eine Hilfsmethode, auf die Sie von überall zugreifen könnten? currentUserProfile() oder etwas? Es macht mir nichts aus, eine Datei mit einigen Shortcut-Methoden für jedes Projekt zu führen, aber beim Hinzufügen von Dingen muss man gut diszipliniert sein, sonst wird der Code schnell unlesbar.

Ich finde die zweite Antwort here eine ziemlich klare Möglichkeit, Ihre eigenen benutzerdefinierten Hilfsmethoden hinzuzufügen.

+0

Auch eine gute Antwort, ich hatte alles andere mit der Beziehung arbeiten, ich wusste einfach nicht, dass es so einfach war wie 'auth() -> user() -> profile' aus meiner Sicht (nicht zu merken, es wurde an den Benutzer angeschlossen und ich dachte, ich brauche eine Composer-Ansicht, Hilfsfunktion oder Dienstleister, um dies zu erreichen), aber ich habe auch von Ihrer Antwort gelernt, also vielen Dank – Derek

Verwandte Themen