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.


Чи є у вашій таблиці користувачів стовпець з ідентифікатором? Якщо ні, то справа в цьому.
OffTheFitz

Так, id там @OffTheFitz таблицю називають користувачами
Джош

Виправте мене, якщо я помиляюся, але ви намагаєтеся зареєструвати зареєстрованого користувача ?? Якщо ви використовуєте Sentry для реєстрації користувача, чому ви телефонуєте Auth::user();? Auth :: user () повертає поточного зареєстрованого користувача, тож ви намагаєтесь зареєструвати користувача, який повинен увійти в систему, це не має сенсу
Altrim

@Josh А як щодо вашої моделі. Що захищенийКлюч?
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();

Це все.

Але для отримання даних користувача, крім ідентифікатора, ви використовуєте:

$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

а що, якщо laravel 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

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

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

Ви можете отримати доступ до автентифікованого користувача через фасад 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 - який ви використовуєте для отримання (нового) зареєстрований ідентифікатор користувача в іншій частині програми. Це проблема, і я вірю, що ви можете запитати. Я зробив такий незграбний хак в 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 }}
}

2

Для Laravel 6.X ви можете зробити наступне:

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

1
дуже елегантна відповідь.
rashedcs

@rashedcs Дякую
Ajjay Arora


0

Ви можете спробувати :

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

1
Незважаючи на те, що ця відповідь технічно може бути правильною, надайте контекст, чому ви вважаєте, що це може вирішити проблему та що це робить, наприклад, (наприклад, при використанні просторів імен будь-що у глобальному просторі імен повинно мати позначку `` перед нею для позначення, що вона знаходиться у глобальному просторі імен а не поточний простір імен)
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.