🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ Alireza far
حل شد. پیاده سازی دسترسی‌ها در API لاراول ۸
مهرداد سامی حل شده توسط مهرداد سامی

با سلام و وقت بخیر

اخیرا توی پروژه ای میخوام که سیستم مدیریت نقش‌ها و دسترسی‌های یوزر‌ها رو پیاده سازی کنم ولی متاسفانه ارور بر میخورم. میخوام که همزمان بتونم اطالاعات کاربر رو ویرایش کنم بتونم دسترسی‌ها و نقش هایی که دارن رو بفرستم. اگه بگید مشکل کجا هست 

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

public function update(Request $request, $userId)
    {
        $user = User::findOrFail($userId);
        $validatedData = request()->validate([
            // validation done
        ]);
        $validatedData['password'] = bcrypt($validatedData['password']);
        $user->update($validatedData);
        $user->refreshPermissions($request->permissions);
        $user->refreshRoles($request->roles);
        return response()->json([
            'statuCode' => 200,
            'desctriprion' => "User updated successfully"
        ]);
    }
Error: BadMethodCallException: Method Illuminate\Database\Eloquent\Collection::sync does not exist. in file /project_dir/vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php on line 103

فعلا به جای فانکشن refreshPermissions از sync به صورت مستقیم استفاده کردم و خیلی خوب کار میکنه و موردی نداره به این صورت:

// Replace it
$user->refreshPermissions($request->permissions);
$user->refreshRoles($request->roles);
// With it
$user->permissions()->sync($request->permissions);
$user->roles()->sync($request->roles);

ولی با این تفاوت اساسی که اینجا permissions و roles با آیدی هاشون کار میکنن. (با اسم کار نمیکنن). (طبق مکانیزمی که در دوره گفته شد قرار هست که با اسم کار کنن)

ولی مشکلی نداره چون شما میتونی به جای ارسال اسم اون permission و role, آیدی هر کدوم رو ارسال کنید.

 

استاد سامی عزیز اگه لازم باشه این مورد رو بررسی و در دوره‌ها عنوان کنید. تشکر

Alireza far ۰۶ بهمن ۱۳۹۹، ۰۹:۱۶

سلام 

 

احتمال میدم داخل فایل HasPermission شما به جای استفاده از متد Permission کالکشن اون رو صدا زدید، یعنی در واقع باید به صورت زیر اون متد رو صدا بزنید 

 

$user->permissions()->sync()

ولی در واقع شما به این صورت صدا زدید 

$user->permissions->sync()
بهترین پاسخ
مهرداد سامی ۰۶ بهمن ۱۳۹۹، ۲۱:۰۳