Когда я просмотрел раздел Laravel Document о частичной яркости ORM, я получил новый термин Mass Assignment
.
Отображение документа Как выполнить массовое присвоение и настройки свойств fillable
или guarded
. Но после этого я не знал о Mass Assignment
и о том, как это работает.
В моем прошлом опыте в CodeIgniter я также не слышал об этом термине.
Есть ли у кого-то простое объяснение?
Массовое назначение - это когда вы отправляете массив в создание модели, в основном устанавливая кучу полей в модели за один раз, а не один за другим, что-то вроде:
$user = new User(Input::all());
(Это вместо того, чтобы явно устанавливать каждое значение в модели отдельно.)
Вы можете использовать fillable
для защиты тех полей, которые вы хотите, чтобы это действительно позволяло обновлять.
Скажем, в вашей пользовательской таблице есть поле user_type
, которое может иметь значения user/admin
Очевидно, что вы не хотите, чтобы пользователи могли обновлять это значение. Теоретически, если бы вы использовали вышеуказанный код, кто-то мог бы ввести в форму новое поле для user_type
и отправить "админ" вместе с другими данными формы и легко переключить свою учетную запись на учетную запись администратора... плохие новости.
Добавив:
$fillable = array('name', 'password', 'email');
Вы гарантируете, что только те значения могут быть обновлены с помощью mass assignment
Чтобы обновить значение user_type
, вам необходимо явно установить его на модели и сохранить его, например:
$user->user_type = 'admin';
$user->save();
$user = new User(Input::all());
(как программист) это настолько неконтролируемо (или в каком сценарии это будет полезно).
Массовое присвоение - это процесс отправки массива данных, которые будут сохранены в указанной модели за один раз. Как правило, вам не нужно сохранять данные в вашей модели по отдельности, а скорее в одном процессе.
Массовое назначение - это хорошо, но за этим стоят определенные проблемы с безопасностью. Что делать, если кто-то передает значение в модель и без защиты может определенно изменить все поля, включая идентификатор. Это не хорошо.
Допустим, у вас есть таблица "студентов", с полями "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 - но не оба.
Для более подробной информации откройте ссылку: - Массовое назначение
Массовое присвоение означает, что вы заполняете строку более чем одним столбцом, используя массив данных. (несколько ярлыка вместо ручного построения массива) с помощью Input::all()
.
Технически только с головы. Fillable означает, что столбцы в таблице могут быть вставлены, защита означает, что модель не может вставляться в этот конкретный столбец.
Обратите внимание, что при попытке выполнить массовое присвоение с помощью вставьте в столбец с именем "secret", и вы указали, что он защищен, вы можете попробовать вставить его через модель, но это никогда не будет вставьте в базу данных.
Это касается безопасности и защиты вашей таблицы при использовании модели. Массовое назначение кажется просто уведомлением или предупреждением о том, что вы не указали модель, которая заполнена и защищена, и делает ее уязвимой для каких-либо атак.
UPDATE
Для Laravel 5.x вы можете обратиться к последнему документу массовому назначению
ИЛИ
Хорошо подробное объяснение того, когда использовать заполняемый или защищенный