Laravel / Eloquent: проверка изнутри модели

Просто справляюсь с Laravel 4.2 и красноречиво. Я смотрел Laravel с нуля на laracasts.com, особенно уроки по валидации и последующему рефакторингу. Примеры, используемые в этих уроках, имеют дело с относительно базовой моделью пользователя, в которой есть только 2 поля: имя пользователя и пароль. Моя модель пользователя содержит еще много полей, и моя регистрационная форма просит пользователя повторно ввести / подтвердить введенный пароль.

По-видимому, рекомендуется, чтобы процесс проверки пользовательского ввода проводился внутри модели, что имеет смысл. Так же, как этот учебник, я пошел вперед и добавил isValid метод моей модели для проверки ввода пользователя в моей регистрационной форме. Я заполняю свою пользовательскую модель на основе ввода следующим образом:

$input = Input::all();
if (!$this->user->fill($input)->isValid()) {
return Redirect::back()->withInput()->withErrors($this->user->errors);
}

Итак, я написал свои правила и получил проверку работоспособности, и теперь я готов сохранить ввод пользователя в базу данных. Однако, так как я заполнил свою модель всем пользовательским вводом, экземпляр пользовательской модели теперь содержит атрибут confirm_password и звонит $user->save(); выдает ошибку (поскольку у меня нет этого поля в таблице базы данных). Кроме того, поскольку я только что ввел пользовательский ввод для проверки, пароль там тоже не хэшируется.

Каков наилучший подход к проверке пользовательского ввода VS, если модель фактически представляет таблицу базы данных? Я знаю, что есть способы, которыми я мог бы обойти все это, выполняя такие вещи, как перемещение валидации за пределы модели и, возможно, просто позволяя модели хранить правила валидации и т. Д., Но я могу обратиться за советом к наилучшей практике.

Спасибо

1

Решение

Вы можете удалить его перед сохранением, например:

$input = Input::all();
if (!$this->user->fill($input)->isValid()) {
return Redirect::back()->withInput()->withErrors($this->user->errors);
}
else {
unset($this->user->attributes['confirm_password']);
$this->user->save();
}

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

// Goes in to your model
protected static function boot()
{
parent::boot();
static::saving(function($model) {
unset($model->attributes['confirm_password']);
});
}

Поскольку вы выполняете валидацию внутри своей модели, вы можете запустить валидацию на saving событие, как:

protected static function boot()
{
parent::boot();
static::saving(function($model) {
if($model->isValid()) {
unset($model->attributes['confirm_password']);
return true;
}
return false;
});
}
2

Другие решения

Есть более хорошие способы сделать то же самое.

  1. Ограничьте ваши входные значения. Вы можете передать Input :: all () вашему валидатору и все же сделать это.

    $input = Input::only('username', 'password');
    // – OR –
    $input = Input::except('confirm_password');
    
  2. добавлять $fillable к вашей модели пользователя.

    class User extends Eloquent {
    protected $fillable = array('id', 'name', 'email', 'password');
    }
    

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

$user = User::create(Input::all());

Это выполнит то, что вы пытаетесь сделать, не сбрасывая входные значения и не добавляя события модели.

1

По вопросам рекламы [email protected]