سلام دوستان..
یه ارور هنگام ذخیره دیتا دارم:
Field 'mytoken' doesn't have a default value
یه فیلد دارم به اسم mytoken که اطلاعاتش رو توی همون متد کنترلر یوزر خودم مشخص میکنم..
یعنی توی فیلدایی که کاربر پر میکنه برای ثبت نام وجود نداره و بعد از این که request رو داخل store کنترلر خودم دریافت میکنم حالا یه متغیر هم برای mytoken اینجا میسازم و مقدار هم بهش میدم و توی دیتایی که قراره ذخیره بشه بهش گفتم توی فیلد مربوط به mytoken توی دیتابیس، مقدار همین متغیر mytoken رو ذخیره کن..
حالا این ارور رو دارم..
توی fillable مادل هم mytoken رو تعریف نکردم و فقط فیلد هایی رو تعریف کردم که توی ویو توسط کاربر پر میشه..
در واقع برداشتم هم همین هست از fillable..
چون متغیر mytoken رو خود سیستم توی کنترلر توی متد store همونجا مقدار دهی میکنه و دست کاربر نیست..
چجوری میتونم حلش کنم این مشکلو؟
ممنون میشم راهنماییم کنید
درود
ببینید Fillable فیلد ها رو میشه به نوعی فیلدهایی در نظر گرفت که کاربر وارد میکنه
اما نکته مهم این وسط
متدی هست که شما استفاده میکنی
در حین کار با الکوئنت:
در حین استفاده از create ما آرایه ای از اتربیوتها رو داریم پاس میدیم یا در واقع داریم Mass Assign میکنیم.
پس اگر از create استفاده کنید در هر صورت باید Fillable فیلد ها رو در مدل وارد کرده باشید. وگرنه ارور دارید.
این MassAssignmentException راهی برای محافظت از سیستم هست -> هنگامی که مثلا از request()->all استفاده میشه
بله مهندس دقیقا از متد save استفاده میکنم..
ینی میفرمایید که وقتی دارم با save دیتا ذخیره میکنم fillable رو پاک کنم از توی مادل خودم؟
مشکل امنیتی هم نداره درسته؟
با روش save
fillable رو هم از توی مادلم پاک کردم
حالا این ارور رو میده بهم..
Add [type] to fillable property to allow mass assignment on [App\Admin].
باز fillable گذاشتم و داخلش هم type رو هم قرار دادم باز همون داستان قبلی پیش میاد..
ممنون میشم راهنماییم کنید
اگر fillable رو گذاشتی که نباید ارور داشته باشی
دقت کن که پراپرتی fillable رو تو مدل درستی گذاشته باشی
و سینتکسش هم درست باشه:
protected $fillable = ['type'];
@javadbolouri72
اگر دقیقا طبق گفته آقای بیات عمل کرده باشید و جواب نگرفتید ممکنه mytoken ی که ارسال میکنید واقعا null باشه و فیلدتون توی دیتابیس not null. این رو هم چک کنید.
نه تست کردم dd که میگیرم همیشه یه مقدار داره توی mytoken
خالی نیست..
ارور میده میگه
doesn't have a default value
اینو باید چکار کنم؟
@javadbolouri72
هردو mytoken و type رو توی fillable قرار بدید درست میشه ، اگر نشد کدتون رو بفرستید احتمالا یه جا اشتباهی رخ داده
ولی اصولیش همینه که آقای بیات فرمودن ، و اگر درست اجرا شده باشه باید جواب بگیرید.
اگر روی امنیتتون حساس هستید نباید فیلد توی fillable اد بشه و مجبورید از save استفاده کنید، در غیر این صورت برای کلیر کد میتونید فیلد رو توی fillable بزارید و mass assign کنید
ببینید دوستان این داخل کنترولرم هست..
یه سری چیزا مث
username
رو کاربر تو ویو وارد میکنه
یه سری چیزا مث
admin_exclusive_token
هم هستن که همونجا داخل کنترلر مقدار دهی میشن و تست هم که گرفتم همیشه مقدار دارن..
تا همه اینا رو اضافه نکنم تو fillable، درست نمیشه..
یه چیزم تست کردم، توی ماگریشن هم اگر جلوی فیلد nullable اضافه کنم و توی fillable ذکر نکنم دیگه گیر نمیده.. ولی خب نمیخوام nullable باشه
۱ کار دیگه هم میتونی بکنی
میتونی بجای fillable از guarded استفاده کنی..
protected $guarded = [];
بله اینی که گفتید رو تست کردم درست کار میکنه..
ولی خب با اینکه توی fillable همه فیلدامو ذکر کنم فرقی نداره..
بحث من سر امنیتش هست که میخوام توی fillable یه سری رو بذارم مثل نام و یه سری رو نذارم مثل token..
ولی خب گیر میده و تا همه رو نذارم داخلش ارور میده..
برعکسشم که عمل کنم یعنی بخوام با guardedاونایی که مس اساین نباید بشن مثل role های دسترسی رو بذارم توی guarded بازم همون گیر رو میده..
یا باید همه رو توی fillable بیارم
یا یه guarded خالی
که این دوتا مث همه
حتی ترکیبی هم تست کردم خطا میداد که اونایی که مس اساین نباید بشن رو تو guarded و بقیه رو توی fillable آوردم..
فقط در صورتی ارور نمیداد که توی ماگریشن جلوی فیلد nullable میذاشتم..
یخورده گیجم کرده...
راستی از بعضی صحبتا برداشتم اینه که حالا که طبق عکسی که بالا فرستادم از مادل نمونه ساختم و save میکنمش دیگه مشکلی از لحاظ امنیتی نداره و mass assign نمیشه، آیا این صحت داره؟
البته همینم تا یه guarded خالی نذارم کار نمیکنه..
@javadbolouri72
وقتی dosent have default value داری یعنی مقدار اولیه برای یکی از ستون ها نزدی و فیلدی که از request داری میفرستی برای اون ستون خالیه و نمیتونه توی ستونی که nullable نیست و یا اگر از نوع enum هست مقدار نداره چیزی ذخیره کنه
دقت کنید
اگر شما از متد all در شئ Request استفاده کنید.. و بخواهید تمام داده ها رو از کاربر بگیری و ذخیره کنی.. اونجاست که مشکل امنیتی پیش میاد..
نه وقتی شما دستی داری داده ها رو وارد میکنی..
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟