Laravel: Auth :: user () -> id cố gắng lấy thuộc tính của một đối tượng không phải


88

Tôi gặp lỗi sau "cố gắng lấy thuộc tính của một không phải đối tượng" khi tôi gửi biểu mẫu để thêm người dùng, lỗi rõ ràng là ở dòng đầu tiên: Auth :: user () -> id của dòng sau :

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

Có ý kiến ​​gì không? Tôi đã tìm kiếm trong một thời gian và mọi thứ tôi thấy đều nói rằng điều này sẽ hoạt động tốt. Người dùng của tôi đã đăng nhập bằng gói xác thực Sentry 2.


Có cột có tên id trong bảng Người dùng của bạn không? Nếu không, đó là vấn đề.
OffTheFitz

Yep, id là có @OffTheFitz bảng được gọi là người sử dụng
Josh

Hãy sửa cho tôi nếu tôi sai nhưng bạn đang cố gắng đăng ký một người dùng đã đăng nhập ?? Nếu bạn đang sử dụng Sentry để đăng ký người dùng tại sao bạn lại gọi Auth::user();? Auth :: user () trả về người dùng đã đăng nhập hiện tại, vì vậy bạn đang cố gắng đăng ký người dùng nên đăng nhập, điều đó không có ý nghĩa gì
Altrim

@Josh Còn mô hình của bạn. Những gì được bảo vệKey?
OffTheFitz

2
Nếu bạn đang sử dụng Sentry, hãy kiểm tra người dùng đã đăng nhập với Sentry::getUser()->id. Lỗi bạn nhận được là Auth::user()trả về NULL và nó cố gắng lấy id từ NULL do đó lỗi trying to get a property from a non-object.
Altrim

Câu trả lời:


61

Nếu bạn đang sử dụng, Sentryhãy kiểm tra người dùng đã đăng nhập với Sentry::getUser()->id. Lỗi bạn nhận được là Auth::user()trả về NULL và nó cố gắng lấy id từ NULL do đó lỗi trying to get a property from a non-object.


2
Tôi thích phương pháp sử dụng chain {{auth () -> user () -> name}}
Hos Thủy

70

Bây giờ với laravel 4.2, thật dễ dàng để lấy id của người dùng:

$userId = Auth::id();

đó là tất cả.

Nhưng để truy xuất dữ liệu của người dùng khác với id, bạn sử dụng:

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

Để biết thêm chi tiết, hãy kiểm tra phần bảo mật của tài liệu


Auth :: id () isking wordking Laravel 6.0
Pavel8289

Đừng quên thêm "sử dụng Illuminate \ Support \ Facades \ Auth;"
mauronet

46

Thực hiện Auth :: check () trước để đảm bảo rằng bạn đã đăng nhập tốt:

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

3
Điều đó chính xác - đầu tiên bạn phải Auth :: check () nếu người dùng đăng nhập. Sau đó, Auth :: getUser () sẽ có một đối tượng hữu ích :)
BlueMan

1
Nếu bạn muốn làm điều này sử dụng khuôn mẫu lưỡi: @if(Auth::check()) {{Auth::user()->id}} @endif(điều này rất hữu ích nếu bạn muốn nhận được ID của người dùng đối với javascript / ajax)
Cato nhỏ

nếu laravel 6 thì sao?
gumuruh

19

id là protected, chỉ cần thêm một phương thức công khai trong/models/User.php

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

vì vậy bạn có thể gọi nó

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

luôn nhớ để kiểm tra xem người dùng đã đăng nhập chưa ...

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

11

Trong Laravel 5.6 tôi sử dụng

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

như gợi ý khác

Auth::id()

dường như áp dụng cho các phiên bản cũ hơn của Laravel 5.x và không hoạt động với tôi.


1
Auth::id()đang hoạt động tốt trong phiên bản laravel 5.7.
RN Kushwaha

8

Kiểm tra routechức năng mà bạn đang sử dụng Auth::user(), Để nhận dữ liệu Auth :: user (), chức năng phải nằm trong webphần mềm trung gian Route::group(['middleware' => 'web'], function () {});.


8

Đừng bao giờ quên bao gồm và cố gắng sử dụng xác thực phần mềm trung gian:

use Illuminate\Http\Request;   

Sau đó, tìm id bằng phương thức yêu cầu:

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

5

sử dụng Illuminate \ Support \ Facades \ Auth;

Trong lớp:

protected $user;

Mã này nó phù hợp với tôi

Trong cấu trúc:

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

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

Vân vân..


5

Nếu ai đang tìm kiếm laravel 5>

 Auth::id() 

cung cấp id của người dùng được ủy quyền


5

Bạn có thể truy cập người dùng đã xác thực thông qua giao diện Auth:

use Illuminate\Support\Facades\Auth;

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

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

4

bạn phải kiểm tra xem người dùng đã đăng nhập chưa?

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

2

Câu hỏi và mẫu mã của bạn hơi mơ hồ và tôi tin rằng các nhà phát triển khác đang tập trung vào điều sai. Tôi đang tạo một ứng dụng trong Laravel, đã sử dụng các hướng dẫn trực tuyến để tạo người dùng mới và xác thực, và dường như đã nhận thấy rằng khi bạn tạo một người dùng mới trong Laravel, không có đối tượng Auth nào được tạo - mà bạn sử dụng để lấy (mới) ID của người dùng đã đăng nhập trong phần còn lại của ứng dụng. Đây là một vấn đề, và tôi tin rằng những gì bạn có thể đang hỏi. Tôi đã thực hiện loại hack vụng về này trong 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);

Không cần phải tạo và xác thực, nhưng tôi không biết phải làm gì khác.


2

Người dùng kiểm tra đầu tiên đã đăng nhập và sau đó

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

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

2

Đối với Laravel 6.X, bạn có thể làm như sau:

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

1
câu trả lời rất thanh lịch.
rashedcs

@rashedcs Cảm ơn
Ajjay Arora

1

Trong Laravel 8.6, những điều sau đây phù hợp với tôi trong bộ điều khiển:

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

0

Bạn co thể thử :

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

1
Mặc dù câu trả lời này có thể đúng về mặt kỹ thuật, vui lòng cung cấp bối cảnh tại sao bạn nghĩ điều này sẽ khắc phục được sự cố và nó có tác dụng gì EG (Khi sử dụng không gian tên, bất kỳ thứ gì trong không gian tên chung cần phải có dấu `` trước nó để biểu thị nó nằm trong không gian tên chung chứ không phải không gian tên hiện tại)
Barkermn01

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

Xin chào và chào mừng bạn đến với stackoverflow và cảm ơn bạn đã trả lời. Mặc dù mã này có thể trả lời câu hỏi, nhưng bạn có thể cân nhắc thêm một số lời giải thích cho vấn đề bạn đã giải quyết và cách bạn giải quyết nó? Điều này sẽ giúp độc giả trong tương lai hiểu rõ hơn câu trả lời của bạn và rút kinh nghiệm.
Plutian

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.