2014-09-21 2 views
1

Laravel 4.2와 웅변에 그저 손을 대지 만. 나는 laracasts.com의 Scratch 캐스트에서 Laravel을 보았습니다. 특히 유효성 검사와 후속 리팩터링에 대한 교훈이었습니다. 이 레슨을 통해 사용 된 예제는 상대적으로 기본적인 사용자 모델을 처리하므로 사용자 이름과 비밀번호 필드가 2 개만 있습니다. 내 사용자 모델에 더 많은 필드가 포함되어 있으며 등록 양식에서 사용자가 입력 한 비밀번호를 다시 입력하거나 확인하도록 요청합니다.Laravel/Eloquent : 모델 내 유효성 확인

사용자 입력의 유효성을 검사하는 과정이 모델 내에서 이루어져야한다는 것이 합리적입니다. 따라서 튜토리얼과 마찬가지로 나는 isValid 메서드를 내 모델에 추가하여 등록 양식의 사용자 입력을 검증합니다.

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

그래서 내 규칙을 작성 및 검증 작업을했고, 지금은 데이터베이스에 사용자의 입력을 저장하기 위해 준비했습니다 :이 같은 입력을 기반으로 내 사용자 모델을 입력합니다. 그러나 모델 전체 인스턴스를 입력 했으므로 이제 사용자 모델 인스턴스에 confirm_password의 특성이 포함되고 $user->save();을 호출하면 데이터베이스 테이블에이 필드가 없기 때문에 오류가 발생합니다. 또한, 유효성을 검사하기 위해 사용자 입력을 전달한 이후 암호가 해시되지 않습니다.

사용자 입력의 유효성 검사와 관련하여 취할 수있는 최상의 접근 방법은 모델이 실제로 데이터베이스 테이블을 나타내는 것입니까? 나는 모델 밖에서 유효성 검사를 이동하고 모델에 유효성 검사 규칙을 저장하게하는 등의 작업을 수행하여 모든 것을 처리 할 수있는 방법이 있음을 알고 있지만 모범 사례에 대한 조언을 구할 수 있습니다.

감사

+0

암호 해싱에'mutator'를 사용하고'confirm_password'를 설정 해제하기 위해'save' 이벤트를 사용할 수 있습니다. 그러나 어쨌든 모델에서 유효성 검사를하지는 않을 것이고, '단순한'솔루션은 현재와 같이 유연성이 부족하고 더 많은 복잡성을 초래할 수 있습니다. –

답변

2

당신은 예를 들어, 저장하기 전에 그것을 제거 할 수는 :

$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 절약 :

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

답변 해 주셔서 감사합니다. 저축 행사가 최선의 방법이라고 생각합니다. 아마도 저장하기 전에 비밀번호를 해시하는 데 사용할 수 있습니다. 어떤 경우에는 내 암호가 해시 또는 일반 텍스트 (데이터베이스에서 사용자를 검색 할 경우 암호 특성이 이미 해시 된 것입니까?) 여부를 확인하는 방법이 있습니까? – Jonathon

+0

환영합니다. 예, 그렇게 생각합니다 :-) –

+0

문자열이 해시 된 경우 확인하는 방법을 알려주세요. 문서를 보면,'Hash'는'make','check','needsRehash'의 3 가지 메소드만을 가지고 있습니다. – Jonathon

1

이 같은 작업을 수행하는 더 좋은 방법이 있습니다 :

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

당신처럼, 당신은 saving 이벤트 유효성 검사를 실행할 수 있습니다 모델 내부 validationg되어 있기 때문에 맡은 일.

  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()); 

이것은 당신이 반환하기 입력 값이나 추가 모델 이벤트없이 뭘 하려는지 달성됩니다.