Laravel: Auth :: user () -> id tentando obter uma propriedade de um objeto não

88

Estou recebendo o seguinte erro "tentando obter uma propriedade de um não-objeto" quando envio um formulário para adicionar um usuário, o erro está aparentemente na primeira linha: Auth :: user () -> id do seguinte :

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

Alguma ideia? Eu procurei por um tempo e tudo que vejo diz que isso deve funcionar bem. Meu usuário está logado usando o pacote de autenticação Sentry 2.

Josh
fonte
Existe uma coluna chamada id em sua tabela de usuário? Se não, esse é o problema.
OffTheFitz
Sim, o id está lá @OffTheFitz a mesa é chamada de usuários
Josh
Corrija-me se eu estiver errado, mas você está tentando registrar um usuário logado ?? Se você está usando o Sentry para registrar um usuário, por que está ligando Auth::user();? o Auth :: user () retorna o usuário conectado no momento, então você está tentando registrar um usuário que deveria estar logado, não faz sentido
Altrim
@Josh e quanto ao seu modelo. Qual é a chave protegida?
OffTheFitz
2
Bem, se você estiver usando o Sentry, verifique o usuário conectado com Sentry::getUser()->id. O erro que você obtém é que Auth::user()retorna NULL e tenta obter id de NULL, portanto, o erro trying to get a property from a non-object.
Altrim

Respostas:

61

Se você estiver usando, Sentryverifique o usuário conectado com Sentry::getUser()->id. O erro que você obtém é que Auth::user()retorna NULL e tenta obter id de NULL, portanto, o erro trying to get a property from a non-object.

Altrim
fonte
2
Eu prefiro usar o método de encadeamento {{auth () -> usuário () -> nome}}
Hos Mercury
70

Agora, com laravel 4.2, é fácil obter a id do usuário:

$userId = Auth::id();

isso é tudo.

Mas para recuperar os dados do usuário diferentes de id, você usa:

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

Para mais detalhes, verifique a parte de segurança da documentação

Dr. MAF
fonte
Auth :: id () está redigindo Laravel 6.0
Pavel8289
Não se esqueça de adicionar "use Illuminate \ Support \ Facades \ Auth;"
mauronet
46

Faça um Auth :: check () antes de se certificar de que você está bem logado:

if (Auth::check())
{
    // The user is logged in...
}
jody_lognoul
fonte
3
Isso está correto - primeiro você deve fazer Auth :: check () se o usuário está loggin. Então o Auth :: getUser () terá um objeto útil :)
BlueMan
1
Se você quiser fazer isso usando modelos de blade: @if(Auth::check()) {{Auth::user()->id}} @endif(isso é útil se você deseja obter o ID do usuário para javascript / ajax)
Cato Minor
e se laravel 6?
gumuruh
19

id é protected, basta adicionar um método público em seu/models/User.php

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

então você pode chamá-lo

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

lembre-se sempre de testar se o usuário está logado ...

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

No Laravel 5.6 eu uso

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

como a outra sugestão

Auth::id()

parece se aplicar a versões mais antigas do Laravel 5.xe não funcionou para mim.

Frankfurt-Laravel
fonte
1
Auth::id()está funcionando bem na versão 5.7 do laravel.
RN Kushwaha
8

Verifique routea função na qual está usando Auth::user(). Para obter os dados Auth :: user (), a função deve estar dentro do webmiddleware Route::group(['middleware' => 'web'], function () {});.

Ashwani Panwar
fonte
8

Nunca se esqueça de incluir e tentar usar autenticação de middleware:

use Illuminate\Http\Request;   

Em seguida, encontre o id usando o método de solicitação:

$id= $request->user()->id;
erupções cutâneas
fonte
5

use Illuminate \ Support \ Facades \ Auth;

Em aula:

protected $user;

Este código funciona para mim

Em construção:

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

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

etc ..

l3okor
fonte
5

Se alguém está procurando laravel 5>

 Auth::id() 

dar id do usuário autorizado

Md Sifatul Islam
fonte
5

Você pode acessar o usuário autenticado por meio da fachada do Auth:

use Illuminate\Support\Facades\Auth;

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

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

você deve verificar se o usuário está logado?

Auth::check() ? Auth::user()->id : null
Vahid Alvandi
fonte
2

Sua pergunta e amostra de código são um pouco vagas e acredito que os outros desenvolvedores estão se concentrando na coisa errada. Estou fazendo um aplicativo no Laravel, usei tutoriais online para criar um novo usuário e autenticação, e parecia ter notado que quando você cria um novo usuário no Laravel, nenhum objeto Auth é criado - que você usa para obter o (novo) ID do usuário conectado no restante do aplicativo. Isso é um problema e acredito no que você pode estar perguntando. Eu fiz esse tipo de hack barulhento em 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);

Não deveria ter que criar e autenticar, mas eu não sabia mais o que fazer.

Andrew Koper
fonte
2

O primeiro usuário de verificação fez login e depois

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

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

Para o Laravel 6.X você pode fazer o seguinte:

$user = Auth::guard(<GUARD_NAME>)->user();
$user_id = $user->id;
$full_name = $user->full_name;
Ajjay Arora
fonte
1
resposta muito elegante.
rashedcs
@rashedcs Obrigado
Ajjay Arora
1

No Laravel 8.6, o seguinte funciona para mim em um controlador:

$id = auth()->user()->id;
user761100
fonte
0

Podes tentar :

$id = \Auth::user()->id
erupções cutâneas
fonte
1
Embora esta resposta possa estar tecnicamente correta, forneça um contexto de porque você acha que isso resolveria o problema e o que ele faz EG (Ao usar namespaces, qualquer coisa no namespace global precisa ter um `` antes de denotar que está no namespace global e não o namespace atual)
Barkermn01
0
 if(Auth::check() && Auth::user()->role->id == 2){ 
         $tags = Tag::latest()->get();
        return view('admin.tag.index',compact('tags'));
    }
Md.Azizur Rahman
fonte
Olá, bem-vindo ao stackoverflow e obrigado por responder. Embora este código possa responder à pergunta, você pode adicionar alguma explicação para o problema que foi resolvido e como você o resolveu? Isso ajudará futuros leitores a entender melhor sua resposta e aprender com ela.
Plutian
0

Está trabalhando comigo:

echo Auth::guard('guard_name')->user()->id;
Abd Abughazaleh
fonte