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

100

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

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

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

Есть ли у кого-то простое объяснение?

Теги:
mass-assignment

4 ответа

152
Лучший ответ

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

$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();
  • 11
    Спасибо за этот ответ, я совершенно не понимаю, кто будет делать такую вещь, как $user = new User(Input::all()); (как программист) это настолько неконтролируемо (или в каком сценарии это будет полезно).
  • 7
    ... это вовсе не смысл ответа, это краткий ответ, не используя его в качестве урока по безопасности и т. д.
Показать ещё 8 комментариев
12

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

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

Допустим, у вас есть таблица "студентов", с полями "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 - но не оба.

Для более подробной информации откройте ссылку: - Массовое назначение

4

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

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

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

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

2

UPDATE

Для Laravel 5.x вы можете обратиться к последнему документу массовому назначению

ИЛИ

Хорошо подробное объяснение того, когда использовать заполняемый или защищенный

  • 2
    На самом деле, я думаю, что документация очень тонкая по этому вопросу. Хотя опытным разработчикам Laravel может быть очевидно, что означает «массовое назначение» (в отличие от «явного обновления Модели»), новичок не поймет различия от чтения этой документации. Я думаю, что это был весь вопрос в первую очередь !!
  • 0
    Ну, я узнал все из документов, даже будучи новичком, также, как он может знать, что правильно во всех этих ответах, когда он вообще не видел документы, когда, очевидно, это самый точный ответ. Такие люди, как вы, возможно, захотят скопировать и вставить случайный ответ.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню