Що означає "масове призначення" у Laravel?


159

Коли я ознайомився з документом Laravel про тему «Красномовна тема ORM», я отримав новий термін 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
так що ви думаєте, відповідаючи на питання під назвою "Що означає" масове призначення "у Laravel?" Я повинен був би детально розглянути питання про валідацію ... це була проста відповідь на питання, не виходячи з колії. Залишимо це як є.
duellsy

8
Не має значення, в чому полягає питання щодо питання про ОП, яке я задав, тому мені не потрібно створювати нову тему, і ви продовжуєте говорити про те, "чому б не" говорити про це. Я просто не розумію, навіщо хтось використовувати рядок, як ви його замість написали$user = new User; $user->name = 'Neo';
Kyslik

26

Присвоєння маси - це процес надсилання масиву даних, який буде збережений у вказаній моделі відразу. Загалом, вам не потрібно зберігати дані на своїй моделі по одному, а скоріше в одному процесі.

Масове призначення добре, але за ним стоять певні проблеми із безпекою. Що робити, якщо хтось передає значення моделі та без захисту, вони можуть точно змінити всі поля, включаючи ідентифікатор. Це не добре.

Скажімо , у вас є таблиця "студенти, з полями « student_type, first_name, last_name » . Ви можете масовий правонаступник" first_name, last_name " , але ви хочете , щоб захистити student_type від того , безпосередньо змінилися. Ось де заливка і охороняв місце.

Подача даних дає змогу вказати, які поля масово призначаються у вашій моделі, ви можете це зробити, додавши $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
}

ви повинні використовувати або $ fillable, або $ guarded - не обидва.

Для більш детальної інформації відкрийте посилання: - масове призначення


1
Це прямо з книги Метта Штауфера "Laravel Up & Running"
віночок

5

Масове призначення означає, що ви заповнюєте рядок більш ніж одним стовпцем, використовуючи масив даних. (дещо скорочення замість того, щоб вручну будувати масив), використовуючи Input::all().

Технічно просто зверху голови. Подача означає, які стовпці в таблиці дозволяється вставляти, захищати означає, що модель не може вставити в цей конкретний стовпець.

Зауважте, що, коли ви намагаєтеся зробити масове завдання з вподобанням, вставіть у стовпчик з назвою "секрет", і ви вказали, що він захищений, ви можете спробувати вставити до нього через модель, але він ніколи насправді не вставить у база даних.

Це для безпеки та захисту на вашому столі під час використання моделі. Масове призначення здається лише повідомленням або попередженням, що ви не сказали моделі, яку можна заповнити і охороняти, і робить її вразливою до якихось атак.


2

Це коли масив отриманих даних одночасно зберігається у моделі.

Через проблеми із безпекою цього методу в laravel, рекомендується визначити поля, для яких бажані дані заповнюватимуться в Моделі.

Ви можете використовувати $fillableзмінну для визначення полів, які потрібно заповнити в таблиці бази даних.

Напр

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

Коли laravel виявляє, що ви присвоюєте масу даних, він змушує вас визначити поля, які потрібно масово призначити в модельному класі.

Хтось може легко передати небажані дані у форму HTML у вашу базу даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.