Laravel Защита столбцов от массового присвоения, которые не могут быть обнулены / значения по умолчанию - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь сделать свойства 'name' и 'email' охраняемыми в моей модели пользователя, потому что я не хочу, чтобы мои пользователи могли изменять их после регистрации.

Моя модель пользователя выглядит следующим образом:

protected $fillable = [
    'province',
    'city',
    'street',
    'postal',
    'cellphone',
    'facebook',
    'instagram',

];

protected $guarded = [
  'name',
  'email',
  'password',
  'account_type',
  'verified_type',
];

При регистрации Laravel по умолчанию массово присваивает эти значения следующим образом:

//Create the user
      $user = User::create([
          'name' => $data['name'],
          'email' => $data['email'],
          'password' => Hash::make($data['password']),
          'province' => $data['province'],
          'city'  => $data['city'],
          'street'  => $data['street'],
          'postal'  => $data['postal'],
          'cellphone' => $data['cellphone'],
          'trial_ends_at' => \Carbon\Carbon::now()->addMonths(3),
          'account_type' => $accountType,
      ]);

Но это выдает ошибку для меня, потому что 'name'не имеет значения по умолчанию и не может быть обнуляемым.Я понимаю, почему я получаю ошибку и как ее исправить, но я хотел бы знать, как мне следует назначить имя и адрес электронной почты, если у них нет свойств по умолчанию / nullable.Например, что-то вроде:

$user = new User();
$user->name = $request->name;
$user->email = $request->email;
$user->save();

$user->update([
  //the rest of the mass assignable values
]);

Или есть более простой способ?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Вы можете сделать это, добавив это в свою модель.

/*
    Attribute which are protected from updating.
*/

protected $protected = [
    'name', 'email'
];

protected static function boot()
{
    parent::boot();

    static::saving(function ($model) {
        if($model->id){
            foreach($model->protected as $attribute){
                $model->$attribute = $model->getOriginal($attribute);
            }
        }
    });
}

Надеюсь, что код самовыражен.

0 голосов
/ 29 сентября 2018

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

public function setNameAttribute($newName)
{
  if(isset($this->name) && $this->name !== null){
    throw new \Exception;
    //or do nothing
  } else {
    $this->attributes['name'] = $newName;
  }
}

и сделайте то же самое для электронной почты тоже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...