Laravel: Auth :: user () -> id tratando de obtener una propiedad de un no objeto


88

Recibo el siguiente error "tratando de obtener una propiedad de un no objeto" cuando envío un formulario para agregar un usuario, el error aparentemente está en la primera línea: Auth :: user () -> id de lo siguiente :

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

¿Algunas ideas? He buscado por un tiempo y todo lo que veo dice que esto debería funcionar bien. Mi usuario ha iniciado sesión con el paquete de autenticación Sentry 2.


¿Hay una columna denominada id en su tabla de usuarios? Si no, ese es el problema.
OffTheFitz

Sí, id está ahí @OffTheFitz, la tabla se llama usuarios
Josh

¿Corrígeme si me equivoco pero estás intentando registrar un usuario que ha iniciado sesión? Si está utilizando Sentry para registrar un usuario, ¿por qué está llamando Auth::user();? el Auth :: user () devuelve el usuario que ha iniciado sesión actualmente, por lo que está intentando registrar un usuario que debería estar conectado, no tiene sentido
Altrim

@Josh ¿Qué hay de tu modelo? ¿Cuál es la clave protegida?
OffTheFitz

2
Bueno, si está utilizando Sentry, verifique el usuario que inició sesión con Sentry::getUser()->id. El error que obtiene es que Auth::user()devuelve NULL e intenta obtener la identificación de NULL, de ahí el error trying to get a property from a non-object.
Altrim

Respuestas:


61

Si está utilizando, Sentrymarque el usuario que inició sesión con Sentry::getUser()->id. El error que obtiene es que Auth::user()devuelve NULL e intenta obtener la identificación de NULL, de ahí el error trying to get a property from a non-object.


2
Prefiero usar el método de encadenamiento {{auth () -> usuario () -> nombre}}
Hos Mercury

70

Ahora con laravel 4.2 es fácil obtener la identificación del usuario:

$userId = Auth::id();

eso es todo.

Pero para recuperar datos del usuario que no sean id, usa:

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

Para obtener más detalles, consulte la parte de seguridad de la documentación.


Auth :: id () está expresando Laravel 6.0
Pavel8289

No olvide agregar "use Illuminate \ Support \ Facades \ Auth;"
mauronet

46

Haga un Auth :: check () antes para asegurarse de que ha iniciado sesión correctamente:

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

3
Eso es correcto - primero debe Auth :: check () si el usuario está loggin. Entonces Auth :: getUser () tendrá un objeto útil :)
BlueMan

1
Si desea hacer esto usando plantillas de hoja: @if(Auth::check()) {{Auth::user()->id}} @endif(esto es útil si desea obtener la identificación del usuario para javascript / ajax)
Cato Minor

¿y si laravel 6?
gumuruh

19

id es protected, simplemente agregue un método público en su/models/User.php

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

para que puedas llamarlo

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

recuerde siempre para probar si el usuario está registrado ...

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

11

En Laravel 5.6 uso

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

como la otra sugerencia

Auth::id()

parece aplicarse a versiones anteriores de Laravel 5.xy no funcionó para mí.


1
Auth::id()funciona bien en laravel 5.7 versión.
RN Kushwaha

8

Verifique routela función en la que está utilizando Auth::user(). Para obtener datos de Auth :: user (), la función debe estar dentro del webmiddleware Route::group(['middleware' => 'web'], function () {});.


8

Nunca olvide incluir e intentar usar la autenticación de middleware:

use Illuminate\Http\Request;   

Luego encuentre la identificación usando el método de solicitud:

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

5

use Illuminate \ Support \ Facades \ Auth;

En la clase:

protected $user;

Este código me funciona

En construcción:

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

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

etc ..


5

Si alguien está buscando laravel 5>

 Auth::id() 

dar la identificación del usuario autorizado


5

Puede acceder al usuario autenticado a través de la fachada de autenticación:

use Illuminate\Support\Facades\Auth;

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

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

4

debe comprobar si el usuario ha iniciado sesión?

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

2

Su pregunta y muestra de código son un poco vagas y creo que los otros desarrolladores se están enfocando en lo incorrecto. Estoy haciendo una aplicación en Laravel, he usado tutoriales en línea para crear un nuevo usuario y autenticación, y parece haber notado que cuando creas un nuevo usuario en Laravel, no se crea ningún objeto Auth, que usas para obtener el (nuevo) ID de usuario que ha iniciado sesión en el resto de la aplicación. Esto es un problema, y ​​creo lo que puede estar preguntando. Hice este tipo de truco cludgy en 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);

No debería tener que crear y autenticar, pero no sabía qué más hacer.


2

El primer usuario de verificación inició sesión y luego

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

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

2

Para Laravel 6.X, puede hacer lo siguiente:

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

1
respuesta muy elegante.
rashedcs

@rashedcs Gracias
Ajjay Arora

1

En Laravel 8.6, lo siguiente funciona para mí en un controlador:

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

0

Puedes probar :

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

1
Si bien esta respuesta podría ser técnicamente correcta, proporcione un contexto de por qué cree que esto solucionaría el problema y qué hace EG (cuando se usan espacios de nombres, cualquier cosa en el espacio de nombres global debe tener un `` antes de eso para indicar que está en el espacio de nombres global y no el espacio de nombres actual)
Barkermn01

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

Hola, bienvenido a stackoverflow y gracias por responder. Si bien este código podría responder la pregunta, ¿puede considerar agregar alguna explicación sobre cuál fue el problema que resolvió y cómo lo resolvió? Esto ayudará a los futuros lectores a comprender mejor su respuesta y aprender de ella.
Plutian

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.