Что означает «массовое назначение» в Laravel?

159

Когда я просмотрел документ Laravel по теме Eloquent ORM, у меня появился новый термин Mass Assignment.

Документ шоу Как сделать массовое назначение и fillableили guardedсвойство настройки. Но после того, как я прошел через это, у меня не было четкого понимания Mass Assignmentтого, как и как это работает.

В моем прошлом опыте в CodeIgniter я также не слышал об этом термине.

У кого-нибудь есть простое объяснение по этому поводу?

Чен-Цу Лин
источник

Ответы:

206

Массовое назначение - это когда вы отправляете массив для создания модели, в основном устанавливая кучу полей в модели за один раз, а не одно за другим, что-то вроде:

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

(Это вместо того, чтобы явно устанавливать каждое значение в модели отдельно.)

Вы можете использовать fillableдля защиты, какие поля вы хотите, чтобы это на самом деле разрешало обновление.

Вы также можете заблокировать массовое назначение всех полей, выполнив это:

protected $guarded = ['*'];

Допустим, в вашей пользовательской таблице у вас есть поле, user_typeкоторое может иметь значения user / admin

Очевидно, вы не хотите, чтобы пользователи могли обновлять это значение. Теоретически, если вы использовали приведенный выше код, кто-то может ввести в форму новое поле для user_typeи отправить «admin» вместе с другими данными формы, и легко переключить свою учетную запись на учетную запись администратора ... плохие новости.

Добавляя:

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

Вы гарантируете, что только эти значения могут быть обновлены с помощью mass assignment

Чтобы иметь возможность обновить user_typeзначение, вам необходимо явно установить его в модели и сохранить, например, так:

$user->user_type = 'admin';
$user->save();
duellsy
источник
16
Спасибо за этот ответ, я совершенно не понимаю, кто будет делать такие вещи, как $user = new User(Input::all());(как программист), что это так бесконтрольно (или в каком сценарии это будет полезно).
Kyslik
14
... это вовсе не смысл ответа, это краткий ответ, не угоняющий его как урок о безопасности и т. д.
duellsy
3
Я понял, и я рад, что нашел этот ответ. Мне просто любопытно, в каком сценарии приведенная выше строка (в моем комментарии) полезна. Я имею в виду без проверки и тому подобное.
Kyslik
4
так что вы думаете в ответ на вопрос «Что значит« массовое назначение »в Laravel?» Я должен был вдаваться в подробности о проверке ... это был простой ответ на вопрос, не сбившись с пути. Оставим это как есть.
Duellsy
8
Неважно, в чем смысл вопроса OP, который я задал, поэтому мне не нужно создавать новую тему, а вы продолжаете говорить «почему бы и нет» говорить об этом. Я просто не понимаю, зачем кому-то использовать строчку, как вы ее написали вместо$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 ' не включены, что означает, что они освобождены.

Охраняется с обратной стороны. Если в параметре fillable указано, какие поля должны быть назначены по массе, параметр guardiled указывает, какие поля нельзя назначить по массе. Итак, в модели:

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().

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

Обратите внимание, что когда вы пытаетесь выполнить массовое назначение с помощью like, вставить в столбец с именем «secret» и указали, что он защищен, вы можете попытаться вставить его через модель, но он никогда не будет вставлен в база данных.

Это для безопасности и защиты на вашем столе при использовании модели. Массовое назначение - это просто уведомление или предупреждение о том, что вы не указали модель, которую можно заполнить и защитить, и делает ее уязвимой для каких-либо атак.

majidarif
источник
2

Это когда массив полученных данных сразу сохраняется в модели.

Из-за проблем безопасности с этим методом в laravel, рекомендуется определить поля, которые вы хотите, чтобы запрошенные данные заполняли в Модели.

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

Например

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

Когда laravel обнаруживает, что вы массово присваиваете данные, вынуждает вас определять поля, которые вы хотите массово назначить в классе модели.

Кто-то может легко передать ненужные данные в виде HTML в вашу базу данных.

Пунит Хандельвал
источник