Laravel: Auth :: user () -> ID, die versucht, eine Eigenschaft eines Nichtobjekts abzurufen


88

Ich erhalte die folgende Fehlermeldung "Ich versuche, eine Eigenschaft eines Nicht-Objekts abzurufen", wenn ich ein Formular zum Hinzufügen eines Benutzers sende. Der Fehler befindet sich anscheinend in der ersten Zeile: Auth :: user () -> ID der folgenden ::

$id = Auth::user()->id;
$currentuser = User::find($id);
$usergroup = $currentuser->user_group;
$group = Sentry::getGroupProvider()->findById($usergroup);

$generatedPassword = $this->_generatePassword(8,8);
$user = Sentry::register(array('email' => $input['email'], 'password' => $generatedPassword, 'user_group' => $usergroup));

$user->addGroup($group);

Irgendwelche Ideen? Ich habe eine Weile gesucht und alles, was ich sehe, sagt, dass dies gut funktionieren sollte. Mein Benutzer ist mit dem Sentry 2-Authentifizierungspaket angemeldet.


Gibt es eine Spalte mit dem Namen id in Ihrer Benutzertabelle? Wenn nicht, ist das das Problem.
OffTheFitz

Ja, ID ist da @OffTheFitz die Tabelle heißt Benutzer
Josh

Korrigieren Sie mich, wenn ich falsch liege, aber Sie versuchen, einen angemeldeten Benutzer zu registrieren? Wenn Sie Sentry verwenden, um einen Benutzer zu registrieren, warum rufen Sie an Auth::user();? Der Auth :: user () gibt den aktuell angemeldeten Benutzer zurück.
Wenn

@ Josh Was ist mit deinem Modell? Was ist der geschützte Schlüssel?
OffTheFitz

2
Wenn Sie Sentry verwenden, überprüfen Sie den angemeldeten Benutzer mit Sentry::getUser()->id. Der Fehler, den Sie erhalten, ist, dass der Auth::user()Wert NULL zurückgibt und versucht, die ID von NULL abzurufen, daher der Fehler trying to get a property from a non-object.
Altrim

Antworten:


61

Wenn Sie verwenden, Sentryüberprüfen Sie den angemeldeten Benutzer mit Sentry::getUser()->id. Der Fehler, den Sie erhalten, ist, dass der Auth::user()Wert NULL zurückgibt und versucht, die ID von NULL abzurufen, daher der Fehler trying to get a property from a non-object.


1
Ich bevorzuge die Methodenverkettung {{auth () -> user () -> name}}
Hos Mercury

70

Mit Laravel 4.2 ist es jetzt einfach, die Benutzer-ID abzurufen:

$userId = Auth::id();

das ist alles.

Um jedoch andere Benutzerdaten als die ID abzurufen, verwenden Sie:

$email = Auth::user()->email;

Weitere Informationen finden Sie im Sicherheitsteil der Dokumentation


Auth :: id () spricht Laravel 6.0
Pavel8289

Vergessen Sie nicht, "use Illuminate \ Support \ Facades \ Auth;" hinzuzufügen.
Mauronet

46

Führen Sie vorher ein Auth :: check () durch, um sicherzustellen, dass Sie gut angemeldet sind:

if (Auth::check())
{
    // The user is logged in...
}

3
Das ist richtig - zuerst müssen Sie Auth :: check (), wenn der Benutzer angemeldet ist. Dann hat der Auth :: getUser () ein nützliches Objekt :)
BlueMan

1
Wenn Sie dies mithilfe von Blade-Vorlagen tun möchten: @if(Auth::check()) {{Auth::user()->id}} @endif(Dies ist nützlich, wenn Sie die Benutzer-ID für Javascript / Ajax erhalten möchten.)
Cato Minor

Was ist, wenn Laravel 6?
Gumuruh

19

ID ist protected, fügen Sie einfach eine öffentliche Methode in Ihre/models/User.php

public function getId()
{
  return $this->id;
}

so kannst du es nennen

$id = Auth::user()->getId();

Denken Sie immer daran, zu testen, ob der Benutzer angemeldet ist ...

if (Auth::check())
{
     $id = Auth::user()->getId();
}

11

In Laravel 5.6 verwende ich

use Auth;
$user_id = Auth::user()->id;

als der andere Vorschlag

Auth::id()

scheint auf ältere Versionen von Laravel 5.x zuzutreffen und hat bei mir nicht funktioniert.


1
Auth::id()funktioniert gut in Laravel 5.7 Version.
RN Kushwaha

8

Überprüfen Sie Ihre routeFunktion auf die Funktion, die Sie verwenden Auth::user(). Um Auth :: user () -Daten abzurufen, sollte sich die Funktion in der webMiddleware befinden Route::group(['middleware' => 'web'], function () {});.


8

Vergessen Sie niemals, Middleware-Authentifizierung einzuschließen und zu verwenden:

use Illuminate\Http\Request;   

Suchen Sie dann die ID mithilfe der Anforderungsmethode:

$id= $request->user()->id;

5

Verwenden Sie Illuminate \ Support \ Facades \ Auth.

Im Unterricht:

protected $user;

Dieser Code funktioniert bei mir

Im Konstrukt:

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

In function:
$this->user->id;
$this->user->email;

etc..


5

Wenn jemand nach Laravel 5> sucht

 Auth::id() 

Geben Sie die ID des autorisierten Benutzers an


5

Sie können über die Auth-Fassade auf den authentifizierten Benutzer zugreifen:

use Illuminate\Support\Facades\Auth;

// Get the currently authenticated user...
$user = Auth::user();

// Get the currently authenticated user's ID...
$id = Auth::id();

4

Sie müssen überprüfen, ob der Benutzer angemeldet ist.

Auth::check() ? Auth::user()->id : null

2

Ihre Frage und Ihr Codebeispiel sind etwas vage, und ich glaube, die anderen Entwickler konzentrieren sich auf das Falsche. Ich mache eine Anwendung in Laravel, habe Online-Tutorials zum Erstellen eines neuen Benutzers und zur Authentifizierung verwendet und anscheinend bemerkt, dass beim Erstellen eines neuen Benutzers in Laravel kein Auth-Objekt erstellt wird - mit dem Sie das (neue) Die ID des angemeldeten Benutzers im Rest der Anwendung. Dies ist ein Problem, und ich glaube, was Sie fragen. Ich habe diese Art von ungeschicktem Hack in userController :: store gemacht:

$user->save();

Session::flash('message','Successfully created user!');

//KLUDGE!! rest of site depends on user id in auth object - need to force/create it here
Auth::attempt(array('email' => Input::get('email'), 'password' => Input::get('password')), true);

Redirect::to('users/' . Auth::user()->id);

Sollte nicht erstellen und authentifizieren müssen, aber ich wusste nicht, was ich sonst tun sollte.


2

Der erste Check-Benutzer hat sich angemeldet und dann

if (Auth::check()){
    //get id of logged in user
    {{ Auth::getUser()->id}}

    //get the name of logged in user
    {{ Auth::getUser()->name }}
}

2

Für Laravel 6.X können Sie Folgendes tun:

$user = Auth::guard(<GUARD_NAME>)->user();
$user_id = $user->id;
$full_name = $user->full_name;

1
sehr elegante Antwort.
Rashedcs

@ Rashedcs Danke
Ajjay Arora

0

Du kannst es versuchen :

$id = \Auth::user()->id

1
Obwohl diese Antwort technisch möglicherweise korrekt ist, geben Sie bitte einen Kontext an, warum das Problem Ihrer Meinung nach behoben werden könnte und was es bewirkt und nicht der aktuelle Namespace)
Barkermn01

0
 if(Auth::check() && Auth::user()->role->id == 2){ 
         $tags = Tag::latest()->get();
        return view('admin.tag.index',compact('tags'));
    }

Hallo und willkommen bei stackoverflow, und danke für die Antwort. Während dieser Code möglicherweise die Frage beantwortet, können Sie eine Erklärung hinzufügen, was das Problem ist, das Sie gelöst haben, und wie Sie es gelöst haben? Dies wird zukünftigen Lesern helfen, Ihre Antwort besser zu verstehen und daraus zu lernen.
Plutian


0

In Laravel 8.6 funktioniert für mich in einem Controller Folgendes:

$id = auth()->user()->id;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.