Laravel: Auth :: user () -> id пытается получить свойство не-объекта


88

Когда я отправляю форму для добавления пользователя, я получаю следующее сообщение об ошибке «пытается получить свойство не-объекта», ошибка, по-видимому, находится в первой строке: Auth :: user () -> id следующего :

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

Любые идеи? Я искал какое-то время, и все, что я вижу, говорит, что это должно работать нормально. Мой пользователь вошел в систему с использованием пакета аутентификации Sentry 2.


Есть ли в вашей пользовательской таблице столбец с именем id? Если нет, проблема в этом.
OffTheFitz

Да, там id @OffTheFitz, таблица называется users
Джош,

Поправьте меня, если я ошибаюсь, но вы пытаетесь зарегистрировать авторизованного пользователя ?? Если вы используете Sentry для регистрации пользователя, почему вы звоните Auth::user();? Auth :: user () возвращает текущего вошедшего в систему пользователя, поэтому вы пытаетесь зарегистрировать пользователя, который должен войти в систему, это не имеет смысла
Altrim

@ Джош А как насчет вашей модели? Что за protectedKey?
OffTheFitz

2
Хорошо, если вы используете Sentry, проверьте зарегистрированного пользователя с помощью Sentry::getUser()->id. Ошибка, которую вы получаете, заключается в том, что Auth::user()возвращается NULL и пытается получить идентификатор из NULL, следовательно, ошибка trying to get a property from a non-object.
Altrim

Ответы:


61

Если вы используете, Sentryпроверьте авторизованного пользователя с Sentry::getUser()->id. Ошибка, которую вы получаете, заключается в том, что Auth::user()возвращается NULL и пытается получить идентификатор из NULL, следовательно, ошибка trying to get a property from a non-object.


2
Я предпочитаю использовать цепочку методов {{auth () -> user () -> name}}
Hos Mercury

70

Теперь с laravel 4.2 легко получить идентификатор пользователя:

$userId = Auth::id();

это все.

Но чтобы получить данные пользователя, отличные от id, вы используете:

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

Для получения дополнительных сведений см. Раздел, посвященный безопасности, в документации.


Auth :: id () говорит Laravel 6.0
Pavel8289

Не забудьте добавить «используйте Illuminate \ Support \ Facades \ Auth;»
mauronet

46

Выполните Auth :: check () перед тем, как убедиться, что вы правильно вошли в систему:

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

3
Это правильно - сначала вы должны выполнить Auth :: check (), если пользователь вошел в систему. Тогда у Auth :: getUser () будет полезный объект :)
BlueMan

1
Если вы хотите сделать это с помощью шаблонов лезвий: @if(Auth::check()) {{Auth::user()->id}} @endif(это полезно, если вы хотите получить идентификатор пользователя для javascript / ajax)
Cato Minor

а что, если ларавел 6?
gumuruh

19

id есть protected, просто добавьте общедоступный метод в свой/models/User.php

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

так что ты можешь называть это

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

не забывайте всегда проверять, вошел ли пользователь в систему ...

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

11

В Laravel 5.6 я использую

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

как другое предложение

Auth::id()

похоже, применимо к более старым версиям Laravel 5.x и не сработало для меня.


1
Auth::id()отлично работает в версии laravel 5.7.
RN Kushwaha

8

Проверьте свою routeфункцию, в которой вы используете. Auth::user()Для получения данных Auth :: user () функция должна находиться внутри webпромежуточного программного обеспечения Route::group(['middleware' => 'web'], function () {});.


8

Никогда не забывайте включать и пытаться использовать auth промежуточного программного обеспечения:

use Illuminate\Http\Request;   

Затем найдите идентификатор с помощью метода запроса:

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

5

используйте Illuminate \ Support \ Facades \ Auth;

В классе:

protected $user;

Этот код работает для меня

В конструкции:

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

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

так далее..


5

Если кто ищет laravel 5>

 Auth::id() 

указать идентификатор авторизованного пользователя


5

Вы можете получить доступ к аутентифицированному пользователю через фасад Auth:

use Illuminate\Support\Facades\Auth;

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

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


2

Ваш вопрос и образец кода немного расплывчаты, и я считаю, что другие разработчики сосредотачиваются не на том. Я делаю приложение на Laravel, использовал онлайн-руководства для создания нового пользователя и аутентификации и, кажется, заметил, что когда вы создаете нового пользователя в Laravel, не создается объект Auth, который вы используете для получения (нового) ID вошедшего в систему пользователя в остальной части приложения. Это проблема, и я верю в то, о чем вы, возможно, спрашиваете. Я сделал такой хакерский взлом в 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);

Не нужно создавать и аутентифицировать, но я не знал, что еще делать.


2

Первый проверяющий пользователь вошел в систему, а затем

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

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


1

В Laravel 8.6 в контроллере у меня работает следующее:

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

0

Можешь попробовать :

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

1
Хотя этот ответ может технически быть правильным, укажите контекст, почему вы думаете, что это решит проблему и что он делает. EG (при использовании пространств имен что-либо в глобальном пространстве имен должно иметь `` перед этим, чтобы обозначить это в глобальном пространстве имен а не текущее пространство имен)
Barkermn01

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

Привет и добро пожаловать в stackoverflow, и спасибо за ответ. Хотя этот код может ответить на вопрос, можете ли вы добавить объяснение того, какая проблема была решена и как вы ее решили? Это поможет будущим читателям лучше понять ваш ответ и извлечь из него уроки.
Плутиан

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.