Laravel: Auth :: user () -> id พยายามรับคุณสมบัติของ non-object


92

ฉันได้รับข้อผิดพลาดต่อไปนี้ "พยายามรับคุณสมบัติที่ไม่ใช่วัตถุ" เมื่อฉันส่งแบบฟอร์มเพื่อเพิ่มผู้ใช้ข้อผิดพลาดปรากฏในบรรทัดแรก: 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 ตารางเรียกว่าผู้ใช้
Josh

แก้ไขฉันถ้าฉันผิด แต่คุณกำลังพยายามลงทะเบียนผู้ใช้ที่เข้าสู่ระบบ ?? หากคุณใช้ Sentry เพื่อลงทะเบียนผู้ใช้ทำไมคุณถึงโทรAuth::user();? Auth :: user () ส่งคืนผู้ใช้ที่เข้าสู่ระบบปัจจุบันดังนั้นคุณกำลังพยายามลงทะเบียนผู้ใช้ที่ควรเข้าสู่ระบบจึงไม่สมเหตุสมผล
Altrim

@ Josh แล้วรุ่นของคุณล่ะ อะไรคือ protectedKey?
OffTheFitz

2
Sentry::getUser()->idดีถ้าคุณกำลังใช้ยามตรวจสอบผู้ใช้ที่ล็อกอินด้วย ข้อผิดพลาดที่คุณได้รับคือการที่ผลตอบแทนโมฆะและพยายามที่จะได้รับรหัสจากโมฆะด้วยเหตุนี้ข้อผิดพลาดAuth::user() trying to get a property from a non-object
Altrim

คำตอบ:


62

ถ้าคุณกำลังใช้การตรวจสอบผู้ใช้ที่ล็อกอินด้วยSentry Sentry::getUser()->idข้อผิดพลาดที่คุณได้รับคือการที่ผลตอบแทนโมฆะและพยายามที่จะได้รับรหัสจากโมฆะด้วยเหตุนี้ข้อผิดพลาดAuth::user()trying to get a property from a non-object


2
ฉันชอบใช้ method chaining {{auth () -> user () -> name}}
Hos Mercury

72

ตอนนี้ด้วย laravel 4.2 มันง่ายที่จะรับ id ของผู้ใช้:

$userId = Auth::id();

นั้นคือทั้งหมด.

แต่ในการดึงข้อมูลของผู้ใช้นอกเหนือจาก id คุณใช้:

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

สำหรับรายละเอียดเพิ่มเติมโปรดตรวจสอบส่วนความปลอดภัยของเอกสารประกอบ


Auth :: id () is wordking Laravel 6.0
Pavel8289

อย่าลืมเพิ่ม "use 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(สิ่งนี้มีประโยชน์หากคุณต้องการรับ ID ผู้ใช้สำหรับ 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()สำหรับการได้รับการรับรองความถูกต้อง :: ผู้ใช้ () ฟังก์ชั่นข้อมูลที่ควรจะเป็นภายในมิดเดิลแวร์web Route::group(['middleware' => 'web'], function () {});


8

อย่าลืมรวมและพยายามใช้มิดเดิลแวร์ auth:

use Illuminate\Http\Request;   

จากนั้นค้นหารหัสโดยใช้วิธีการร้องขอ:

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

6

คุณสามารถเข้าถึงผู้ใช้ที่ได้รับการรับรองความถูกต้องผ่านทางซุ้ม Auth:

use Illuminate\Support\Facades\Auth;

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

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

5

ใช้ Illuminate \ Support \ Facades \ Auth;

ในชั้นเรียน:

protected $user;

รหัสนี้ใช้ได้กับฉัน

ในการสร้าง:

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

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

ฯลฯ ..




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 }}
}



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 และขอขอบคุณสำหรับการตอบรับ แม้ว่ารหัสนี้อาจตอบคำถามได้ แต่คุณสามารถพิจารณาเพิ่มคำอธิบายเกี่ยวกับปัญหาที่คุณแก้ไขได้หรือไม่และคุณจะแก้ไขได้อย่างไร ซึ่งจะช่วยให้ผู้อ่านในอนาคตเข้าใจคำตอบของคุณได้ดีขึ้นและเรียนรู้จากคำตอบนั้น
Plutian

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.