راکت
حل شده

خطای property of a non-object در لاراول

8 پاسخ

سلام و عرض خسته نباشید😁😁😁

من توی کنترولرم توی دو تا فانکشن دو بار ی متغیر رو ساختم که اصلا اینکارم جالب نیست

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class ProfileController extends Controller
{
    //

    public function upload_avatar( ){
        $username = Auth::user()->username;

    }
    public function show_avatar(){

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

    }
}

حالا با خودم گفتم که بیام ی متغیر global بسازم و توی فانکشن هام اونو صدا بزنم

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class ProfileController extends Controller
{
    //
private $username;

   public function __construct()
    {
              $this->username = Auth::user()->username;
    }

    public function upload_avatar( ){
              $this->username
    }
    public function show_avatar(){

            $this->username

    }
}

چون حالا دیگه مجبور نیستم که بیام دو بار ی متغیر رو تعریف کنم

ولی با این خطا مواجه شدم :(

Laravel: Auth::user()->username trying to get a property of a non-object

لطفا کمکم کنید با تشکر :)

ثبت پرسش جدید

پاسخ‌ها

8
سبحان مولایی
سبحان مولایی
@websaz

تخصص: برنامه‌نویس وب: Python :: Django :: Node :: Php :: Laravel :: JS :: React :: React Native

بهترین پاسخ

بله دقیقا مثل کد اولتون روش هایی وجود داره که username رو توی کلاس تعریف کنید ولی خیلی سخت و پیچیده میشه بعد فقط یک متغیر هست نه یک متد

saman khoshghadam
saman khoshghadam
@thethinkerdev

تخصص: برنامه نویس وب

سلام
توجه کنید این متد استاتیک user هیچی برگردانده(null) چون حتما شما کاربری لاگین نکردید وگرنه چنین چیزی پیش نمیاد شما این روت رو مخصوص کاربر ها کنید یا به روش های بسیار زیاد دیگر چک کنید تا مهمان ها نتونن وارد بشن
@ahmadrezabashari

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

دقت کن که Auth::user() کاربر لاگین کرده رو بر میگردونه. حالا اگر کاربر لاگین نباشه مقدارش null هست.
پس کدی که سعی در اجراش داری، بعضی مواقع حالت زیر رو پیدا میکنه:

null->username

که متن خطا هم داره دقیقا همین رو میگه. میگه که نمیتونم پراپرتی username رو از داده ای که آبجکت نیست بگیرم.

شاید پاسخ شما همین‌جا باشد

سبحان مولایی
سبحان مولایی
@websaz

تخصص: برنامه‌نویس وب: Python :: Django :: Node :: Php :: Laravel :: JS :: React :: React Native

سلام متد Auth::user کاربر که فعال هست ( لاگین کرده) رو برمی گردونه. الان در این قسمت کاربر لاگین نکرده و مقدار هم null هست. برای این که چه کنید دو راه وجود داره:
1 توی روت Middleware به نام auth رو قرار بدید مثل:

Route::get('myurl',function () { ... })->middleware(['auth',/* other middlewares */]);

2 استفاده از متد check مثل:

if (\Auth::check()) {
   /* User is authenticated */
} else {
   /* User isn't authenticated */
}
احمدرضا بشری
احمدرضا بشری
@ahmadrezabashari

تخصص: برنامه نویسی وب و سرور

سلام و عرض خسته نباشید
کاربر لاگین کرده!!!!!!
موضوع اینه که وقتی از روش اول یعنی تکرار کد ( کثیف کاری ) استفاده میکنم ،مقدار کاربر رو برمیگردونه !!

ولی در روش دوم این پیام خطا رو دریافت میکنم !!
@samkh.dev
@ali.bayat
@websaz

سبحان مولایی
سبحان مولایی
@websaz

تخصص: برنامه‌نویس وب: Python :: Django :: Node :: Php :: Laravel :: JS :: React :: React Native

دوست عزیز کد نویسی کثیف دیگه چیه وقتی متد __construct ران میشه هنوز لاراول کامل بوت نشده در نتیجه null برمی گردونه.
باید در همون متد استفاده کنید

احمدرضا بشری
احمدرضا بشری
@ahmadrezabashari

تخصص: برنامه نویسی وب و سرور

@websaz

این کد من هست

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class ProfileController extends Controller
{
    //

    private $username;
    public function __construct()
    {
        if (Auth::check()) {
            /* User is authenticated */
            $this->username = Auth::user()->username;

         } else {

            $this->username = "Not Found";

        }
    }

    public function upload_avatar( Request $request){

        echo $this->username;
    }

}

اینم روتی که براش تعریف کردم :

Route::group(['middleware' => ['auth'] , 'prefix' => 'users/'] , function(){

    // روت های مربوط به کنترولر مشخصات کاربری
    Route::post('profile/avatar/upload', [ProfileController::class , 'upload_avatar'])->name("upload_avatar");

});

خروجی رو به این صورت بر میگدردونه

Not Found 
احمدرضا بشری
احمدرضا بشری
@ahmadrezabashari

تخصص: برنامه نویسی وب و سرور

پس یعنی منظورتون اینه که باید توی همون فانکشنی که تعریف کردم ازش استفاده کنم ؟؟؟ مثل کد زیر؟؟

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class ProfileController extends Controller
{
    //

    public function upload_avatar( ){
        $username = Auth::user()->username;

    }

}

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام