JBolouri
4 سال پیش توسط JBolouri مطرح شد
13 پاسخ

fillable در لاراول

سلام دوستان..

یه ارور هنگام ذخیره دیتا دارم:
Field 'mytoken' doesn't have a default value

یه فیلد دارم به اسم mytoken که اطلاعاتش رو توی همون متد کنترلر یوزر خودم مشخص میکنم..
یعنی توی فیلدایی که کاربر پر میکنه برای ثبت نام وجود نداره و بعد از این که request رو داخل store کنترلر خودم دریافت میکنم حالا یه متغیر هم برای mytoken اینجا میسازم و مقدار هم بهش میدم و توی دیتایی که قراره ذخیره بشه بهش گفتم توی فیلد مربوط به mytoken توی دیتابیس، مقدار همین متغیر mytoken رو ذخیره کن..

حالا این ارور رو دارم..

توی fillable مادل هم mytoken رو تعریف نکردم و فقط فیلد هایی رو تعریف کردم که توی ویو توسط کاربر پر میشه..
در واقع برداشتم هم همین هست از fillable..
چون متغیر mytoken رو خود سیستم توی کنترلر توی متد store همونجا مقدار دهی میکنه و دست کاربر نیست..

چجوری میتونم حلش کنم این مشکلو؟
ممنون میشم راهنماییم کنید


ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
1

درود

ببینید Fillable فیلد ها رو میشه به نوعی فیلدهایی در نظر گرفت که کاربر وارد میکنه
اما نکته مهم این وسط
متدی هست که شما استفاده میکنی

در حین کار با الکوئنت:

  • اگر از متد save استفاده کنی.. هیچ نیازی به fillable ها نیست
  • اگر از متد create استفاده کنی (که برای روابط بین مدلها بیشتر هم استفاده میشه) قضیه کمی فرق میکنه

در حین استفاده از create ما آرایه ای از اتربیوتها رو داریم پاس میدیم یا در واقع داریم Mass Assign میکنیم.
پس اگر از create استفاده کنید در هر صورت باید Fillable فیلد ها رو در مدل وارد کرده باشید. وگرنه ارور دارید.

این MassAssignmentException راهی برای محافظت از سیستم هست -> هنگامی که مثلا از request()->all استفاده میشه


JBolouri
@javadbolouri72 4 سال پیش مطرح شد
0

@ali.bayat

بله مهندس دقیقا از متد save استفاده میکنم..
ینی میفرمایید که وقتی دارم با save دیتا ذخیره میکنم fillable رو پاک کنم از توی مادل خودم؟
مشکل امنیتی هم نداره درسته؟


JBolouri
@javadbolouri72 4 سال پیش مطرح شد
0

با روش save
fillable رو هم از توی مادلم پاک کردم

حالا این ارور رو میده بهم..

Add [type] to fillable property to allow mass assignment on [App\Admin].

باز fillable گذاشتم و داخلش هم type رو هم قرار دادم باز همون داستان قبلی پیش میاد..

ممنون میشم راهنماییم کنید


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

اگر fillable رو گذاشتی که نباید ارور داشته باشی

دقت کن که پراپرتی fillable رو تو مدل درستی گذاشته باشی
و سینتکسش هم درست باشه:

protected $fillable = ['type'];

وحید
تخصص : Fullstack
@forughi.vahid 4 سال پیش مطرح شد
0

@javadbolouri72
اگر دقیقا طبق گفته آقای بیات عمل کرده باشید و جواب نگرفتید ممکنه mytoken ی که ارسال میکنید واقعا null باشه و فیلدتون توی دیتابیس not null. این رو هم چک کنید.


JBolouri
@javadbolouri72 4 سال پیش مطرح شد
0

@forughi.vahid

نه تست کردم dd که میگیرم همیشه یه مقدار داره توی mytoken
خالی نیست..

ارور میده میگه
doesn't have a default value

اینو باید چکار کنم؟


وحید
تخصص : Fullstack
@forughi.vahid 4 سال پیش آپدیت شد
0

@javadbolouri72
هردو mytoken و type رو توی fillable قرار بدید درست میشه ، اگر نشد کدتون رو بفرستید احتمالا یه جا اشتباهی رخ داده
ولی اصولیش همینه که آقای بیات فرمودن ، و اگر درست اجرا شده باشه باید جواب بگیرید.
اگر روی امنیتتون حساس هستید نباید فیلد توی fillable اد بشه و مجبورید از save استفاده کنید، در غیر این صورت برای کلیر کد میتونید فیلد رو توی fillable بزارید و mass assign کنید


JBolouri
@javadbolouri72 4 سال پیش مطرح شد
0

@ali.bayat
@forughi.vahid
توضیح تصویر رو وارد کنید

ببینید دوستان این داخل کنترولرم هست..
یه سری چیزا مث
username
رو کاربر تو ویو وارد میکنه

یه سری چیزا مث
admin_exclusive_token
هم هستن که همونجا داخل کنترلر مقدار دهی میشن و تست هم که گرفتم همیشه مقدار دارن..

تا همه اینا رو اضافه نکنم تو fillable، درست نمیشه..
یه چیزم تست کردم، توی ماگریشن هم اگر جلوی فیلد nullable اضافه کنم و توی fillable ذکر نکنم دیگه گیر نمیده.. ولی خب نمیخوام nullable باشه


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

۱ کار دیگه هم میتونی بکنی
میتونی بجای fillable از guarded استفاده کنی..

protected $guarded = [];

JBolouri
@javadbolouri72 4 سال پیش مطرح شد
0

@ali.bayat

بله اینی که گفتید رو تست کردم درست کار میکنه..
ولی خب با اینکه توی fillable همه فیلدامو ذکر کنم فرقی نداره..

بحث من سر امنیتش هست که میخوام توی fillable یه سری رو بذارم مثل نام و یه سری رو نذارم مثل token..
ولی خب گیر میده و تا همه رو نذارم داخلش ارور میده..

برعکسشم که عمل کنم یعنی بخوام با guardedاونایی که مس اساین نباید بشن مثل role های دسترسی رو بذارم توی guarded بازم همون گیر رو میده..

یا باید همه رو توی fillable بیارم
یا یه guarded خالی
که این دوتا مث همه

حتی ترکیبی هم تست کردم خطا میداد که اونایی که مس اساین نباید بشن رو تو guarded و بقیه رو توی fillable آوردم..

فقط در صورتی ارور نمیداد که توی ماگریشن جلوی فیلد nullable میذاشتم..

یخورده گیجم کرده...

راستی از بعضی صحبتا برداشتم اینه که حالا که طبق عکسی که بالا فرستادم از مادل نمونه ساختم و save میکنمش دیگه مشکلی از لحاظ امنیتی نداره و mass assign نمیشه، آیا این صحت داره؟

البته همینم تا یه guarded خالی نذارم کار نمیکنه..


نوب
تخصص : کدنویس نوب :)
@yk5742g 4 سال پیش مطرح شد
1

@javadbolouri72
وقتی dosent have default value داری یعنی مقدار اولیه برای یکی از ستون ها نزدی و فیلدی که از request داری میفرستی برای اون ستون خالیه و نمیتونه توی ستونی که nullable نیست و یا اگر از نوع enum هست مقدار نداره چیزی ذخیره کنه


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
1

دقت کنید
اگر شما از متد all در شئ Request استفاده کنید.. و بخواهید تمام داده ها رو از کاربر بگیری و ذخیره کنی.. اونجاست که مشکل امنیتی پیش میاد..

نه وقتی شما دستی داری داده ها رو وارد میکنی..


JBolouri
@javadbolouri72 4 سال پیش مطرح شد
0

@ali.bayat
بله ممنون بابت راهنمایی های ارزشمندتون 🌷🌷


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

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