लारावेल में "मास असाइनमेंट" का क्या अर्थ है?


159

जब मैं लारवेल डॉक्यूमेंट के बारे में एलोक्वेंट ओआरएम विषय भाग के माध्यम से गया, तो मुझे एक नया शब्द मिला Mass Assignment

दस्तावेज़ शो कैसे जन असाइनमेंट और ऐसा करने के लिए fillableया guardedगुण सेटिंग्स। लेकिन उस के माध्यम से जाने के बाद, मुझे इस बारे में स्पष्ट रूप से समझ नहीं आया Mass Assignmentकि यह कैसे काम करता है।

CodeIgniter में अपने पिछले अनुभव में, मैंने इस शब्द के बारे में सुना भी नहीं था।

क्या किसी के बारे में एक सरल व्याख्या है?


जवाबों:


206

बड़े पैमाने पर असाइनमेंट तब होता है जब आप मॉडल निर्माण के लिए एक सरणी भेजते हैं, मूल रूप से एक बार में एक ही बार में मॉडल के खेतों का एक समूह सेट करते हैं, एक के बाद एक, जैसे कुछ:

$user = new User(request()->all());

(यह मॉडल पर प्रत्येक मान को स्पष्ट रूप से अलग से सेट करने के बजाय है।)

आप fillableसुरक्षा के लिए उपयोग कर सकते हैं कि आप किन क्षेत्रों को वास्तव में अपडेट करने की अनुमति देना चाहते हैं।

ऐसा करने से आप सभी क्षेत्रों को बड़े पैमाने पर होने से रोक सकते हैं:

protected $guarded = ['*'];

मान लें कि आपकी उपयोगकर्ता तालिका में आपके पास एक फ़ील्ड है जो user_typeउपयोगकर्ता / व्यवस्थापक के मान हो सकते हैं

जाहिर है, आप नहीं चाहते कि उपयोगकर्ता इस मूल्य को अपडेट कर सकें। सिद्धांत रूप में, यदि आपने उपरोक्त कोड का उपयोग किया है, तो कोई user_typeअन्य प्रपत्र डेटा के साथ 'व्यवस्थापक' भेजने के लिए एक नए फ़ील्ड के रूप में इंजेक्ट कर सकता है , और आसानी से अपने खाते को एक व्यवस्थापक खाते में स्विच कर सकता है ... बुरी खबर।

जोड़ कर:

$fillable = ['name', 'password', 'email'];

आप यह सुनिश्चित कर रहे हैं कि केवल उन्हीं मूल्यों का उपयोग करके अपडेट किया जा सकता है mass assignment

user_typeमूल्य को अपडेट करने में सक्षम होने के लिए , आपको इसे मॉडल पर स्पष्ट रूप से सेट करने और इसे सहेजने की आवश्यकता है, जैसे:

$user->user_type = 'admin';
$user->save();

16
इस उत्तर के लिए धन्यवाद, मुझे यह समझ में नहीं आया $user = new User(Input::all());कि प्रोग्रामर के रूप में कौन ऐसा काम करेगा (इसलिए यह अनियंत्रित है (या किस परिदृश्य में यह मददगार होगा)।
किस्लिक

14
... यह जवाब के सभी बिंदुओं पर नहीं है, यह जवाब को बिना सुरक्षा के पूरे पाठ के रूप में अपहरण किए बिना छोटा रखना है
duellsy

3
मुझे यह बात मिल गई, और मुझे खुशी है कि मुझे यह उत्तर मिला। मैं सिर्फ इस बात से उत्सुक हूं कि किस लाइन को उद्धृत किया गया है (मेरी टिप्पणी में) उपयोगी। मेरा मतलब है कि सत्यापन के बिना और उस सामान के चारों ओर।
किस्लीक

4
तो आप एक सवाल के जवाब में सोचते हैं जिसका शीर्षक है "लारवेल में" मास असाइनमेंट "का क्या मतलब है?" मुझे सत्यापन के बारे में विस्तार से जाना चाहिए था ... यह बिना पटरी से उतरे सवाल का सरल उत्तर था। चलिए इसे वैसे ही छोड़ देते हैं।
द्वैत

8
इससे कोई फर्क नहीं पड़ता कि मैंने जो ओपी प्रश्न पूछा है उसका क्या मतलब है इसलिए मुझे नया धागा बनाने की ज़रूरत नहीं है, और आप इसके बारे में "क्यों नहीं" के बारे में बात करते रहते हैं। मुझे आसानी से समझ में नहीं आ रहा है कि कोई व्यक्ति लाइन का उपयोग क्यों करेगा जैसा कि आपने इसके बजाय लिखा है$user = new User; $user->name = 'Neo';
Kyslik

26

मास असाइनमेंट, डेटा की एक सरणी भेजने की एक प्रक्रिया है जिसे एक ही बार में निर्दिष्ट मॉडल पर सहेजा जाएगा। सामान्य तौर पर, आपको अपने मॉडल पर एक आधार पर, बल्कि एक ही प्रक्रिया में डेटा को सहेजने की आवश्यकता नहीं है।

मास असाइनमेंट अच्छा है, लेकिन इसके पीछे कुछ सुरक्षा समस्याएं हैं। क्या होगा अगर कोई मॉडल के लिए एक मूल्य पारित करता है और सुरक्षा के बिना वे निश्चित रूप से आईडी सहित सभी क्षेत्रों को संशोधित कर सकते हैं। यह अच्छा नहीं है।

चलो कहते हैं कि तुम हो 'छात्रों की मेज, क्षेत्रों के साथ "student_type, FIRST_NAME, LAST_NAME" । आप बड़े पैमाने पर असाइन "FIRST_NAME, LAST_NAME" कर सकते हैं लेकिन आप की रक्षा करना चाहते हैं student_type से सीधे बदला जा रहा। यही कारण है कि जहां fillable और पहरा ले जगह।

भरण योग्य आपको यह निर्दिष्ट करने की अनुमति देता है कि आपके मॉडल में कौन से क्षेत्र बड़े पैमाने पर हैं, आप इसे $fillableमॉडल में विशेष चर जोड़कर कर सकते हैं । तो मॉडल में:

class Student extends Model {
      protected $fillable = ['first_name', 'last_name']; //only the field names inside the array can be mass-assign
} 

' student_type ' शामिल नहीं हैं, जिसका अर्थ है कि उन्हें छूट दी गई है।

गार्ड भरने योग्य का उल्टा है। यदि भरने योग्य निर्दिष्ट करता है कि किन क्षेत्रों को बड़े पैमाने पर सौंपा जाना है, तो संरक्षित निर्दिष्ट करता है कि कौन से क्षेत्र बड़े पैमाने पर असाइन नहीं किए जाते हैं। तो मॉडल में:

class Student extends Model {
      protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}

आपको या तो $ भरने योग्य या $ संरक्षित का उपयोग करना चाहिए - दोनों नहीं।

अधिक जानकारी के लिए लिंक खोलें: - मास असाइनमेंट


1
यह मैट स्टौफ़्फ़ेर की पुस्तक "Laravel अप एंड चल रहा है" के सीधे बाहर है
धीरे

5

बड़े पैमाने पर असाइनमेंट का मतलब है कि आप डेटा की एक सरणी का उपयोग करके एक से अधिक कॉलम के साथ एक पंक्ति भर रहे हैं। (मैन्युअल रूप से सरणी बनाने के बजाय कुछ शॉर्टकट) का उपयोग करके Input::all()

तकनीकी तौर पर सिर्फ मेरे सिर के ऊपर से। भरण योग्य का मतलब है कि तालिका में कौन से कॉलम डालने की अनुमति है, संरक्षित होने का मतलब है कि मॉडल उस विशेष कॉलम में नहीं डाल सकता है।

ध्यान दें कि जब आप इसके साथ एक बड़े कार्य को करने का प्रयास करते हैं, तो "गुप्त" नामक एक कॉलम में सम्मिलित करें, और आपने निर्दिष्ट किया है कि यह संरक्षित है, आप इसे मॉडल के माध्यम से सम्मिलित करने का प्रयास कर सकते हैं, लेकिन यह वास्तव में सम्मिलित नहीं होगा। डेटाबेस।

यह मॉडल का उपयोग करते समय सुरक्षा और आपकी मेज पर सुरक्षा के लिए है। बड़े पैमाने पर असाइनमेंट सिर्फ एक सूचना या चेतावनी के रूप में प्रतीत होता है कि आपने उस मॉडल को नहीं बताया जो भरने योग्य और संरक्षित है और यह किसी प्रकार के हमलों के लिए असुरक्षित बनाता है।


2

यह तब होता है जब प्राप्त आंकड़ों का एक सरणी एक मॉडल में एक बार में सहेजा जाता है।

लारवेल में इस पद्धति के साथ सुरक्षा समस्याओं के कारण, यह अनुशंसा की जाती है कि आप उन क्षेत्रों को परिभाषित करें जो आप मॉडल पर पॉप्युलेट करने के लिए अनुरोधित डेटा चाहते हैं।

आप $fillableडेटाबेस तालिका पर उन क्षेत्रों को परिभाषित करने के लिए चर का उपयोग कर सकते हैं जिन्हें आप पॉप्युलेट करना चाहते हैं।

उदाहरण के लिए

Protected $fillable = [‘username’, dob’, email’,];

जब लार्वा का पता चलता है कि आप बड़े पैमाने पर डेटा असाइन कर रहे हैं, तो यह आपको मॉडल क्लास में उन क्षेत्रों को परिभाषित करने के लिए मजबूर करता है जिन्हें आप बड़े पैमाने पर असाइन करना चाहते हैं।

कोई व्यक्ति अवांछित डेटा को आसानी से अपने डेटाबेस में html फॉर्म में दे सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.