Laravel: Auth :: user () -> id che cerca di ottenere una proprietà di un non oggetto


92

Ricevo il seguente errore "cercando di ottenere una proprietà di un non oggetto" quando invio un modulo per aggiungere un utente, l'errore è apparentemente sulla prima riga: Auth :: user () -> id of the following :

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

Qualche idea? Ho cercato per un po 'e tutto quello che vedo dice che dovrebbe funzionare bene. Il mio utente ha effettuato l'accesso utilizzando il pacchetto di autenticazione di Sentry 2.


C'è una colonna chiamata id nella tua tabella utente? In caso contrario, questo è il problema.
OffTheFitz

Sì, l'id è lì @OffTheFitz il tavolo si chiama utenti
Josh

Correggimi se sbaglio ma stai cercando di registrare un utente loggato ?? Se stai usando Sentry per registrare un utente, perché stai chiamando Auth::user();? Auth :: user () restituisce l'utente attualmente connesso, quindi stai tentando di registrare un utente che dovrebbe essere loggato, non ha senso
Altrim

@ Josh E il tuo modello. Cos'è la protectedKey?
OffTheFitz

2
Bene, se stai usando Sentry, controlla l'utente connesso con Sentry::getUser()->id. L'errore che ottieni è che Auth::user()restituisce NULL e cerca di ottenere id da NULL da cui l'errore trying to get a property from a non-object.
Altrim

Risposte:


62

Se stai usando Sentrycontrolla l'utente loggato con Sentry::getUser()->id. L'errore che ottieni è che Auth::user()restituisce NULL e cerca di ottenere id da NULL da cui l'errore trying to get a property from a non-object.


2
Preferisco usare il metodo concatenato {{auth () -> user () -> name}}
Hos Mercury

72

Ora con laravel 4.2 è facile ottenere l'ID dell'utente:

$userId = Auth::id();

questo è tutto.

Ma per recuperare i dati dell'utente diversi dall'id, usi:

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

Per maggiori dettagli, controlla la parte relativa alla sicurezza della documentazione


Auth :: id () è wordking Laravel 6.0
Pavel8289

Non dimenticare di aggiungere "usa Illuminate \ Support \ Facades \ Auth;"
mauronet

46

Fai un Auth :: check () prima per assicurarti di aver effettuato correttamente l'accesso:

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

3
È corretto: prima devi eseguire Auth :: check () se l'utente sta accedendo. Quindi Auth :: getUser () avrà un oggetto utile :)
BlueMan

1
Se vuoi farlo usando il template blade: @if(Auth::check()) {{Auth::user()->id}} @endif(questo è utile se vuoi ottenere l'ID utente per javascript / ajax)
Cato Minor

e se laravel 6?
gumuruh

19

id è protected, basta aggiungere un metodo pubblico nel tuo file/models/User.php

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

così puoi chiamarlo

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

ricordati sempre di verificare se l'utente è loggato ...

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

11

In Laravel 5.6 utilizzo

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

come l'altro suggerimento

Auth::id()

sembra applicarsi alle versioni precedenti di Laravel 5.x e non ha funzionato per me.


1
Auth::id()funziona bene nella versione 5.7 di laravel.
RN Kushwaha

8

Verificare routela funzione in cui si sta utilizzando Auth::user(), per ottenere i dati Auth :: user () la funzione dovrebbe essere all'interno del webmiddleware Route::group(['middleware' => 'web'], function () {});.


8

Non dimenticare mai di includere e provare a utilizzare l'autenticazione del middleware:

use Illuminate\Http\Request;   

Quindi trova l'ID utilizzando il metodo di richiesta:

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

6

È possibile accedere all'utente autenticato tramite la facciata Auth:

use Illuminate\Support\Facades\Auth;

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

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

5

usa Illuminate \ Support \ Facades \ Auth;

In classe:

protected $user;

Questo codice funziona per me

In costruzione:

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

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

eccetera..



4

devi controllare se l'utente ha effettuato il login?

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

2

La tua domanda e il codice di esempio sono un po 'vaghi e credo che gli altri sviluppatori si stiano concentrando sulla cosa sbagliata. Sto creando un'applicazione in Laravel, ho utilizzato tutorial online per creare un nuovo utente e un'autenticazione e mi è sembrato di aver notato che quando crei un nuovo utente in Laravel, non viene creato alcun oggetto Auth, che usi per ottenere ID utente connesso nel resto dell'applicazione. Questo è un problema e credo a quello che potresti chiedere. Ho fatto questo tipo di hack cludgy in 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);

Non avrei dovuto creare e autenticare, ma non sapevo cos'altro fare.


2

Il primo utente di controllo ha effettuato l'accesso e poi

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

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

2

Per Laravel 6.X puoi fare quanto segue:

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

1
risposta molto elegante.
rashedcs

1

In Laravel 8.6, quanto segue funziona per me in un controller:

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

0

Puoi provare :

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

1
Anche se questa risposta potrebbe essere tecnicamente corretta, fornisci un contesto sul motivo per cui pensi che questo risolverebbe il problema e cosa fa EG (Quando si utilizzano gli spazi dei nomi, qualsiasi cosa nello spazio dei nomi globale deve avere una `` prima di denotare che è nello spazio dei nomi globale e non lo spazio dei nomi corrente)
Barkermn01

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

Ciao e benvenuto in stackoverflow e grazie per aver risposto. Sebbene questo codice possa rispondere alla domanda, puoi considerare di aggiungere qualche spiegazione per quale problema hai risolto e come lo hai risolto? Ciò aiuterà i futuri lettori a comprendere meglio la tua risposta e ad imparare da essa.
Plutian

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.