Armin Rahmati
2 سال پیش توسط Armin Rahmati مطرح شد
23 پاسخ

اعتبارسنجی

سلام دوستان.
من سه تا جدول دارم: users, deliveries, roles
زمانی که میخوام راننده جدید ایجاد کنم، داخل Request اومدم به صورت زیر تعریف کردم:

public function rules()
    {
        return [
            'user_id' => ['required', 'exists:users,id', 'unique:deliveries,user_id'],
        ];
    }

حالا میخوام یه محدودیت دیگه بذارم که راننده حتما نقشش delivery باشه.
ممنون میشم راهنمایی کنید.


ثبت پرسش جدید
ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 2 سال پیش آپدیت شد
0

خب

$this->user() 

فقط کاربری رو برمی گردونه که توی همون درخواست(کلاینت) همون زمان که درخواست و می فرسته لاگین شده و ربطی به userid داخل پارامترای ورودی نداره

پس از این کد استفاده کن

            'user_id' => [
                'required',
                'exists:users,id',
                'unique:deliveries,user_id',
                function($attribute, $value, $fail){
                    if( User::find($value)->roles->pluck('name')->doesntContain('delivery') )
                        $fail('The user has not the `delivery` role !'); //The error message
                }
            ]

البته بالای کد ها هم بزن مدلو وارد کن:

use App\Models\User;

ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 2 سال پیش آپدیت شد
0

بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ
الْحَمْدُ لِلّٰه

https://laravel.com/docs/9.x/validation#custom-validation-rules
سلام، تو میتونی از closure ها استفاده کنی و خودت بری واجد شرایط نبودن رو با $fail مشخص کنی و غیره... مثل مسیج ها رو واسه خطاها خودت مدیریت کنی!

نگاهی کن :

public function rules()
{
    return [
        'user_id' => ['required', 'exists:users,id', 'unique:deliveries,user_id',function($attribute, $value, $fail){
            //handle the $fail your self
            //if the $fail callback does not invoke, it will mean that validated! other wise means to unvalidated 
            if($failed)
                $fail('The error message!');
        }],
    ];
}

Armin Rahmati
@arminrahmati999 2 سال پیش مطرح شد
0

@abol313
متوجه کدی که نوشتین نشدم ولی به صورت زیر نوشتم:

'user_id' => ['required', 'exists:users,id', 'unique:deliveries,user_id', Rule::exists('deliveries')->where(function ($query) {
                return $query->where('user_id', $this->user()->roles->pluck('name') == 'delivery');
            })],

ولی وقتی آیدی کاربری رو که نقش راننده داره وارد میکنم ارور میده که user_id صحیح نمی باشد.


ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 2 سال پیش مطرح شد
0

بشه دقیقا خطا رو بفرستی و منظورت رو دقیق تر بگی ؟

منظور از منظورم تو چت قبلی اینه که بعضی قوانین وجود نداره که واسه اعتبار سنجی مناسب باشه و خب پس باید بعضی جاها از خودمون قوانین سفارشی بسازیم که اعتبار سنجی رو انجام بده
خب حالا مثلا داخل قانون سفارشی بیا کارتو که نمیشه با قوانین از قبل تعریف شده انجام داد، پس بیا خودت قانون سفارشی رو واسه کارت پیاده کن
خب حالا کارتم اینه که کاربر نقش delivery داشته باشه
در مورد مدل دیتابیس های درگیر هم توضیحی بده مثلا فیلد و اسمش و ‌.. که مربوط میشه به این قانون سفارشی که باید بررسی بشه


Armin Rahmati
@arminrahmati999 2 سال پیش آپدیت شد
0

@abol313
منظورم از ارور، ارور ولیدیشن هست.
من یه جدول users دارم، یه جدول deliveries دارم که داخل این جدول یه فیلد هست به نام:

$table->foreignId('user_id')->constrained('users')->cascadeOnUpdate()->cascadeOnDelete();

یه جدولم دارم به نام roles که یه فیلد داره به صورت زیر:

$table->string('name'); 

حالا میخوام زمانی که ادمین میخواد یه کاربر به عنوان راننده ثبت کنه اون کاربر نقش راننده داشته باشه و اگه نقشش راننده نبود اجازه ثبت نده.


ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 2 سال پیش مطرح شد
0

اگه میشه یک شات هم از همون خطایی که گفتی واست میاد بگیر یا متنشو دقیق بفرست :)


Armin Rahmati
@arminrahmati999 2 سال پیش مطرح شد
0

@abol313
خدمت شما.

{
    "message": "گزینه انتخاب شده user id صحیح نمی باشد",
    "errors": {
        "user_id": [
            "گزینه انتخاب شده user id صحیح نمی باشد"
        ]
    }
}

ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 2 سال پیش آپدیت شد
0

try it!

            'user_id' => [
                'required',
                'exists:users,id',
                'unique:deliveries,user_id',
                function($attribute, $value, $fail){
                    if( $this->user()->roles->pluck('name')->doesntContain('delivery') )
                        $fail('The user has not the `delivery` role !'); //The error message
                }
            ]

Armin Rahmati
@arminrahmati999 2 سال پیش مطرح شد
0

@abol313
الان هر user_id ای که بزنم ارور میده

{
    "message": "The user has not the `delivery` role !",
    "errors": {
        "user_id": [
            "The user has not the `delivery` role !"
        ]
    }
}

ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 2 سال پیش مطرح شد
0

اون roles رادرست پیاده کردی؟


Armin Rahmati
@arminrahmati999 2 سال پیش مطرح شد
0

@abol313
بله، چون جایی دیگه دارم از همین رابطه نقش کاربر رو برمیگردونم.
آخه این کدی که شما فرمودین، هر کاربری با هر نقشی رو آدیشو وارد کنم ارور میده.


ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 2 سال پیش مطرح شد
0

مقدار name دقیقا باید چه باشه و میشه قبل از اجرای کد های closure یک dd() از pluck بگیری ؟

 dd($this->user()->roles->pluck('name'));

Armin Rahmati
@arminrahmati999 2 سال پیش مطرح شد
0

@abol313
مقدار name، نام نقش هاس.
الان آیدی هر کاربری رو وارد میکنم خروجی dd میشه:

^ Illuminate\Support\Collection {#1374
  #items: array:1 [
    0 => "super-admin"
  ]
  #escapeWhenCastingToString: false
}

ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 2 سال پیش مطرح شد
0

خب دیگه نقش راننده نداره!


Armin Rahmati
@arminrahmati999 2 سال پیش مطرح شد
0

@abol313
داخل دیتابیس 7 تا نقش وجود داره.


ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 2 سال پیش مطرح شد
0

منظور ؟


Armin Rahmati
@arminrahmati999 2 سال پیش مطرح شد
0

@abol313
منظور اینه که چرا آیدی هر کاربر رو میزنم نقشش رو برنمیگردونه و واسه همه super-admin رو برمیگردونه


ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 2 سال پیش آپدیت شد
0

خب

$this->user() 

فقط کاربری رو برمی گردونه که توی همون درخواست(کلاینت) همون زمان که درخواست و می فرسته لاگین شده و ربطی به userid داخل پارامترای ورودی نداره

پس از این کد استفاده کن

            'user_id' => [
                'required',
                'exists:users,id',
                'unique:deliveries,user_id',
                function($attribute, $value, $fail){
                    if( User::find($value)->roles->pluck('name')->doesntContain('delivery') )
                        $fail('The user has not the `delivery` role !'); //The error message
                }
            ]

البته بالای کد ها هم بزن مدلو وارد کن:

use App\Models\User;

Armin Rahmati
@arminrahmati999 2 سال پیش مطرح شد
0

@abol313
الان آیدی هر کاربری رو بزنم ثبت میکنه، در واقع کاربرایی هم که نقششون راننده نیست هم ثبت میکنه و ارور نمیده.


ابوالفضل رجائی نسب
تخصص : برنامه نویس (laravel-backend-p...
@abol313 2 سال پیش مطرح شد
0

از dd مجددا استفاده کن


Armin Rahmati
@arminrahmati999 2 سال پیش مطرح شد
0

@abol313
تشکر فراوان بابت وقت گرانبهایی که گذاشتین.


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

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