특성에 대한 고유한 유효성 검사 규칙이 있는 Laravel 업데이트 모델

나는 라라벨이 있다.User고유한 유효성 검사 규칙이 있는 모델username그리고.emailRepository에서는 모델을 갱신할 때 필수 규칙 검증에 문제가 없도록 필드를 재검증합니다.

public function update($id, $data) {
$user = $this->findById($id);
$user->fill($data);
$this->validate($user->toArray());
$user->save();
return $user; } 

이것은 다음 테스트에서 실패합니다.

확인예외: {“사용자명”:[“사용자명은 이미 사용되었습니다.”,”email”:[“이메일은 이미 수신되었습니다.”]}

우아하게 고칠 수 있는 방법이 있을까요?



질문에 대한 답변



를 추가합니다.idvalidator에 현재 업데이트되고 있는 인스턴스의 경우.

  1. 패스 더id원하는 검증자를 무시합니다.

  2. 검증자에서 매개 변수를 사용하여 리소스를 업데이트하는지 또는 생성하는지를 탐지합니다.

업데이트할 경우 고유 규칙이 지정된 ID를 무시하도록 강제합니다.

//rules 'email' => 'unique:users,email_address,' . $userId, 

작성하는 경우는, 통상대로 진행됩니다.

//rules 'email' => 'unique:users,email_address', 



또 다른 우아한 방법은…

모델에서 정적 함수를 만듭니다.

public static function rules ($id=0, $merge=[]) {
return array_merge(
[
 'username'
=> 'required min:3 max:12 unique:users,username' . ($id ? ",$id" : ''),
 'email'
=> 'required email unique:member'. ($id ? ",id,$id" : ''),
 'firstname' => 'required min:2',
 'lastname'
=> 'required min:2',
 ...
],
$merge); } 

생성 시 유효성 검사:

$validator = Validator::make($input, User::rules()); 

업데이트 시 유효성 검사:

$validator = Validator::make($input, User::rules($id)); 

업데이트 시 검증(몇 가지 추가 규칙 포함):

$extend_rules = [
'password'
=> 'required min:6 same:password_again',
'password_again' => 'required' ]; $validator = Validator::make($input, User::rules($id, $extend_rules)); 

좋아.




질문 범위 내에서 작업:

public function update($id, $data) {
$user = $this->findById($id);
$user->fill($data);
$this->validate($user->toArray(), $id);
$user->save();
return $user; }
public function validate($data, $id=null) {
$rules = User::$rules;
if ($id !== null) {
$rules['username'] .= ",$id";
$rules['email'] .= ",$id";
}
$validation = Validator::make($data, $rules);
if ($validation->fails()) {
throw new ValidationException($validation);
}
return true; } 

위에서 인정받은 답변에 근거해 제가 한 일입니다.

편집: Form Requests를 사용하면 모든 것이 심플해집니다.

<?php namespace AppHttpRequests;
class UpdateUserRequest extends Request {
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
 'name' => 'required unique:users,username,'.$this->id,
 'email' => 'required unique:users,email,'.$this->id,
];
} } 

Update User Request를 업데이트 메서드에 전달하고 모델 ID를 POST하기만 하면 됩니다.




Larabel에서 다른 컬럼 ID를 사용한 일의 검증

'UserEmail'=>"required email unique:users,UserEmail,$userID,UserID" 



또는 폼 리퀘스트에서 할 수 있는 것은 (Larabel 5.3+의 경우)

public function rules() {
return [
'email' => 'required email unique:users,email,'. $this->user
//here user is users/{user} from resource's route url
]; } 

라라벨 5.6에서 해봤는데 효과가 있었어요