Laravel: Auth :: user () -> id próbując uzyskać właściwość obiektu niebędącego obiektem


88

Otrzymuję następujący błąd „próbuję uzyskać właściwość obiektu niebędącego obiektem”, kiedy przesyłam formularz w celu dodania użytkownika, błąd znajduje się najwyraźniej w pierwszej linii: Auth :: user () -> id następującego :

$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);

Jakieś pomysły? Szukałem przez chwilę i wszystko, co widzę, mówi, że powinno działać dobrze. Mój użytkownik jest zalogowany przy użyciu pakietu uwierzytelniania Sentry 2.


Czy w Twojej tabeli użytkowników znajduje się kolumna o nazwie id? Jeśli nie, to jest problem.
OffTheFitz

Tak, id jest tam @OffTheFitz, tabela nazywa się users
Josh

Popraw mnie, jeśli się mylę, ale próbujesz zarejestrować zalogowanego użytkownika? Jeśli używasz Sentry do rejestracji użytkownika, dlaczego dzwonisz Auth::user();? Auth :: user () zwraca aktualnie zalogowanego użytkownika, więc próbujesz zarejestrować użytkownika, który powinien być zalogowany, to nie ma sensu
Altrim

@Josh A co z twoim modelem. Whats the protectedKey?
OffTheFitz

2
Cóż, jeśli używasz Sentry, sprawdź zalogowanego użytkownika z Sentry::getUser()->id. Otrzymany błąd polega na tym, że Auth::user()zwraca NULL i próbuje uzyskać identyfikator z NULL, stąd błąd trying to get a property from a non-object.
Altrim,

Odpowiedzi:


61

Jeśli używasz, Sentrysprawdź zalogowanego użytkownika z Sentry::getUser()->id. Otrzymany błąd polega na tym, że Auth::user()zwraca NULL i próbuje uzyskać identyfikator z NULL, stąd błąd trying to get a property from a non-object.


2
Wolę korzystać z łączenia metod {{auth () -> user () -> name}}
Hos Mercury,

70

Teraz dzięki laravel 4.2 łatwo jest uzyskać identyfikator użytkownika:

$userId = Auth::id();

to wszystko.

Ale aby odzyskać dane użytkownika inne niż id, używasz:

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

Aby uzyskać więcej informacji, zapoznaj się z częścią dokumentacji dotyczącą bezpieczeństwa


Auth :: id () to wordking Laravel 6.0
Pavel8289

Nie zapomnij dodać „use Illuminate \ Support \ Facades \ Auth;”
mauronet

46

Wykonaj Auth :: check () przed, aby upewnić się, że jesteś dobrze zalogowany:

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

3
Zgadza się - najpierw musisz wykonać Auth :: check (), jeśli użytkownik jest loggin. Wtedy Auth :: getUser () będzie miał przydatny obiekt :)
BlueMan

1
Jeśli chcesz to zrobić za pomocą szablonów blade: @if(Auth::check()) {{Auth::user()->id}} @endif(jest to przydatne, jeśli chcesz uzyskać identyfikator użytkownika dla javascript / ajax)
Cato Minor

co jeśli laravel 6?
gumuruh

19

id jest protected, po prostu dodaj metodę publiczną do swojego/models/User.php

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

więc możesz to nazwać

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

pamiętaj, aby zawsze sprawdzić, czy użytkownik jest zalogowany ...

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

11

W Laravel 5.6 używam

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

jak inna sugestia

Auth::id()

wydaje się, że dotyczy starszych wersji Laravel 5.x i nie działa dla mnie.


1
Auth::id()działa dobrze w wersji laravel 5.7.
RN Kushwaha

8

Sprawdź swoją routefunkcję, w której używasz. Auth::user()Aby uzyskać dane Auth :: user (), funkcja powinna znajdować się w weboprogramowaniu pośrednim Route::group(['middleware' => 'web'], function () {});.


8

Nigdy nie zapomnij dołączyć i spróbować użyć uwierzytelniania oprogramowania pośredniego:

use Illuminate\Http\Request;   

Następnie znajdź identyfikator za pomocą metody żądania:

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

5

użyj Illuminate \ Support \ Facades \ Auth;

W klasie:

protected $user;

Ten kod działa dla mnie

W konstrukcji:

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

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

itp..



5

Możesz uzyskać dostęp do uwierzytelnionego użytkownika za pośrednictwem fasady autoryzacji:

use Illuminate\Support\Facades\Auth;

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

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

4

musisz sprawdzić, czy jest zalogowany użytkownik?

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

2

Twoje pytanie i próbka kodu są trochę niejasne i uważam, że inni programiści koncentrują się na niewłaściwej rzeczy. Tworzę aplikację w Laravel, korzystałem z samouczków online do tworzenia nowego użytkownika i uwierzytelniania i wydawało się, że zauważyłem, że podczas tworzenia nowego użytkownika w Laravel nie jest tworzony żaden obiekt Auth - którego używasz do uzyskania (nowego) identyfikator zalogowanego użytkownika w pozostałej części aplikacji. To jest problem i wierzę, o co możesz pytać. Zrobiłem taki niezgrabny hack w userController :: store:

$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);

Nie powinno być tworzenia i uwierzytelniania, ale nie wiedziałem, co jeszcze zrobić.


2

Pierwszy sprawdzający użytkownik zalogował się, a następnie

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

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

2

W przypadku Laravel 6.X możesz wykonać następujące czynności:

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

1
bardzo elegancka odpowiedź.
rashedcs

@rashedcs Thanks
Ajjay Arora

1

W Laravel 8.6 następujące elementy działają u mnie w kontrolerze:

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

0

Możesz spróbować :

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

1
Chociaż ta odpowiedź może być technicznie poprawna, proszę podać kontekst, dlaczego myślisz, że to rozwiązałoby problem i co robi EG (Kiedy używasz przestrzeni nazw, cokolwiek w globalnej przestrzeni nazw musi mieć `` przed nim, aby wskazać, że znajduje się w globalnej przestrzeni nazw a nie bieżącą przestrzeń nazw)
Barkermn01

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

Cześć i witaj w stackoverflow i dziękuję za odpowiedź. Chociaż ten kod może odpowiedzieć na pytanie, czy możesz rozważyć dodanie wyjaśnienia, jaki problem został rozwiązany i jak go rozwiązałeś? Pomoże to przyszłym czytelnikom lepiej zrozumieć Twoją odpowiedź i uczyć się z niej.
Plutian

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.