Просто справляюсь с 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, если модель фактически представляет таблицу базы данных? Я знаю, что есть способы, которыми я мог бы обойти все это, выполняя такие вещи, как перемещение валидации за пределы модели и, возможно, просто позволяя модели хранить правила валидации и т. Д., Но я могу обратиться за советом к наилучшей практике.
Спасибо
Вы можете удалить его перед сохранением, например:
$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;
});
}
Есть более хорошие способы сделать то же самое.
Ограничьте ваши входные значения. Вы можете передать Input :: all () вашему валидатору и все же сделать это.
$input = Input::only('username', 'password');
// – OR –
$input = Input::except('confirm_password');
добавлять $fillable
к вашей модели пользователя.
class User extends Eloquent {
protected $fillable = array('id', 'name', 'email', 'password');
}
Затем вы можете заполнить базу данных из ввода, и будут заполнены только столбцы в массиве с возможностью заполнения. Убедитесь, что у вас есть хорошие правила проверки, если вы попробуете это.
$user = User::create(Input::all());
Это выполнит то, что вы пытаетесь сделать, не сбрасывая входные значения и не добавляя события модели.