Что означает "Массовое назначение" в Laravel?
Когда я просмотрел документ Laravel о красноречивой части темы ORM, я получил новый термин Mass Assignment
.
Документ показывает, как выполнить массовое назначение и настройки свойств fillable
или guarded
. Но после того, как я прошел через это, у меня не было четкого представления о Mass Assignment
и о том, как это работает.
В моем прошлом опыте работы с CodeIgniter я также не слышал об этом термине.
У кого-нибудь есть простое объяснение этому?
4 answers
Массовое назначение - это когда вы отправляете массив для создания модели, в основном устанавливая кучу полей в модели за один раз, а не по одному, что-то вроде:
$user = new User(Input::all());
(Это вместо явного задания каждого значения в модели отдельно.)
Вы можете использовать fillable
для защиты полей, которые вы хотите, чтобы это действительно позволяло обновлять.
Допустим, в вашей таблице пользователей у вас есть поле user_type
, которое может иметь значения пользователя / администратор
Очевидно, вы не хотите, чтобы пользователи могли обновлять это значение. Теоретически, если бы вы использовали приведенный выше код, кто-то мог бы ввести в форму новое поле для user_type
и отправить "администратор" вместе с другими данными формы и легко переключить свою учетную запись на учетную запись администратора... плохие новости.
Добавив:
$fillable = array('name', 'password', 'email');
Вы гарантируете, что только эти значения могут быть обновлены с помощью mass assignment
Чтобы иметь возможность обновлять значение user_type
, вам необходимо явно установить его в модели и сохраните его, вот так:
$user->user_type = 'admin';
$user->save();
Массовое назначение - это процесс отправки массива данных, которые будут сохранены в указанной модели сразу. В общем случае вам не нужно сохранять данные в вашей модели по одному, а скорее в одном процессе.
Массовое назначение - это хорошо, но за этим стоят определенные проблемы с безопасностью. Что делать, если кто-то передаст значение модели и без защиты он определенно сможет изменить все поля, включая идентификатор. Это нехорошо.
Допустим, у вас есть "ученики" таблица с полями " тип_студента, имя, фамилия". Возможно, вы захотите массово назначить "имя, фамилию", но вы хотите защитить тип_студента от прямого изменения. Вот где заполняемые и охраняемые имеют место.
Заполняемый позволяет указать, какие поля могут быть назначены в вашей модели, вы можете сделать это, добавив специальную переменную $fillable
в модель. Итак, в модели:
class Student extends Model {
protected $fillable = ['first_name', 'last_name']; //only the field names inside the array can be mass-assign
}
'тип_студента' являются не включены, что означает, что они освобождены.
Защищенный - это обратная сторона заполняемого. Если заполняемый указывает, какие поля должны быть назначены массово, защищенный указывает, какие поля не могут быть назначены массово. Итак, в модели:
class Student extends Model {
protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}
Вы должны использовать либо $заполняемый, либо $защищенный - не оба.
Для получения более подробной информации откройте ссылку: - Массовое назначение
Массовое назначение означает, что вы заполняете строку более чем одним столбцом, используя массив данных. (что-то вроде ярлыка вместо ручного построения массива) с использованием Input::all()
.
Технически только с моей головы. Заполняемый означает, какие столбцы в таблице разрешено вставлять, защищенный означает, что модель не может вставлять в этот конкретный столбец.
Обратите внимание, что при попытке выполнить массовое задание с помощью like вставьте в столбец с именем "секрет", и вы указали то, что он защищен, вы можете попытаться вставить в него через модель, но на самом деле он никогда не будет вставлен в базу данных.
Это для безопасности и защиты вашего стола при использовании модели. Массовое назначение, по-видимому, является просто уведомлением или предупреждением о том, что вы не сообщили модели, которая заполняется и охраняется, и делает ее уязвимой для каких-либо атак.
ОБНОВЛЕНИЕ
Для Laravel 5.x вы можете обратиться к последнему массовому назначению doc
ИЛИ
Подробное объяснение того, когда следует использовать заполняемый или защищенный