[Laravel] Validator

[Laravel] Validator updated_at: 2024-08-01 16:27

Validator

기본적으로는 데이타 와 rules만 존재하여도 동작함

공식문서

use Validator;
$validator = Validator::make(...);
$validator = Validator::make([데이타], [rules], [error message]);
$validator = Validator::make([데이타], [rules]); // error message는 생략가능하다.
use Validator;
.........
return Validator::make($data, [
  'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
  'name' => ['required', 'string', 'min:2', 'max:20'],
  'password' => ['required', 'string', 'min:8', 'confirmed'],
], [
  'name.required' =>'이름을 입력하세요',
  'name.min' =>'이름은 최소 2자리 이상입니다.',
  'name.max' =>'이름은 최대 20자리 미만입니다',

  'email.required' =>'이메일을 입력해주세요.',
  'email.email' =>'이메일형식이 잘못되었습니다.',
  'email.unique' =>'사용하려는 이메일이 이미 존재합니다.',

  'password.required' =>'패스워드를 입력해 주세요',
  'password.min' =>'패스워드는 최소 8자 이상입니다',
  'password.confirmed' =>'패스워드가 일치하지 않습니다',
]);

Rule 표기방식

"|" 을 이용하여 사용하는 예제

'name' => 'required'
'email' => 'required|email|max:255|unique:users' 

예_ 'email' => 'unique:users,email_address'

unique:table,column,except,idColumn

배열을 사용하는 예제

'name' => ['required', 'min:5'],
'email' => ['required', 'email', 'max:255', 'unique:users']

Rules

다양한 룰들이 존재하는데 여기서는 몇몇 헷갈리기 쉬운 것들에 대해 설명드립니다.
기타 상세한 내용은 공식 문서를 참조 바랍니다.

unique

unique는 테이블에 동일한 값이 존재하는지 확인하는 검사이다.

unique:테이블,컬럼,ignore
'email' => 'unique:users' // 컬럼이 생략된 경우 validation의 필드이름(여기서는 email) 이 사용된다.
// users  테이블의 email 컬럼에서 유니쿼한 값이 있는지 확인

'email' => 'unique:users:email_address' // users  테이블의 email_address 컬럼에서 유니쿼한 값이 있는지 확인
'email' => 'unique:users:email_address:'.$user->id // users  테이블의 $user->id값을 가지는 id를 제외하고  email_address 컬럼에서 유니쿼한 값이 있는지 확인

위와 같은 내용은 Rule 을 사용하여되 되는데 위의 예제에서 ignore 값이 id가 아닌 다른 컬럼(user_id) 값이라면 아래와 같이 도 처리가능합니다.

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
 
Validator::make($data, [
  'email' => [
    'required',
    Rule::unique('users', 'email_address')->ignore($user->id, 'user_id'),
  ],
]);

혹은 아래와 같이 좀더 복잡한 경우는 where clauses를 사용하여도 구현가능합니다.

'email' => Rule::unique('users')->where(fn (Builder $query) => $query->where('account_id', 1))

confirmed

confirmed 는 두개의 입력값이 동일한지 확인할때 사용합니다.
입력값은 {field}_confirmation 처럼 사용하시면 됩니다.

'password' => ['required', 'confirmed'] // data에 password와 password_confirmation이 입력되어야 합니다.

current_password

현재 password를 확인할때 유용한 방식입니다.

'password' => 'current_password:web' // web에서는 이렇게 처리하면 됩니다.
'password' => 'current_password:api' // Auth guard [api] is not defined.

코딩으로 처리할 경우는

$user = $request->user();
if (Hash::check($request->password, $user->password)) {
..........
}

sometimes

data에서 값이 존재하거나 조건에 따라 rule 을 추가하거나 변경 가능합니다.

$validator = Validator::make($request->all(), [
  'email' => 'sometimes|required|email' // request에 email이 있으면 유효성 검사를 진행합니다.
]);

특정 조건이 만족할 경우 validation을 처리할 때 사용합니다..
games가 100 보다 크면 reason이라는 field에 대해서 'required|max:500' 로 validation을 체크하는 예제입니다.

use Illuminate\Support\Fluent;
 
$validator->sometimes('reason', 'required|max:500', function (Fluent $input) {
   return $input->games >= 100;
});

// multi field에 대해서도 아래와 같이 처리 합니다.
$validator->sometimes(['reason', 'cost'], 'required', function (Fluent $input) {
  return $input->games >= 100;
});

regex not_regex

PHP의 정규식 패턴을 활용한 validation 입니다.

"password' => [
  'regex:/^.*(?=.{3,})(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[\d\X])(?=.*[!$#%]).*$/',
  'confirmed'
] // The password format is invalid.
password' => [
  'regex:/[0-9]/',
  'regex:/[@$!%*#?&]/'
]
'amount' => ['required',  'regex:/^[\d\s,]*$/']    <= 컴마가 포함된 정수

After

validation 후에 추가적으로 validation을 처리할때 사용합니다.

$validator = Validator::make(...);
..........
$validator->after(function($validator)
{
  if ($this->somethingElseIsInvalid())
  {
    $validator->errors()->add('field', 'Something is wrong with this field!');
  }
});

if ($validator->fails())
{
  //
}

validation fail 처리하기

if ($validator->fails()) {
  return Response::json(['error'=>false 'message' => $validator->messages()], 203);
}
if ($validator->fails()) return redirect()->back()->withErrors($validator->errors());
if ($validator->fails()) return redirect()->back()->withErrors($validator->errors());
if ($validator->fails()) return redirect()->back()->withErrors($validator->errors()->first()); // 에러의 첫번째 내용만 리턴

Ridirect or Response 예제

if ($validator->fails()) {
  return response()->json(['error'=>$validator->errors()->first()], 203);
}
@if (!$errors->isEmpty())
  {!! $errors->first() !!}
@endif

모든 에러 출력

@if ($errors->any())
  @foreach ($errors->all() as $error)
    {{ $error }}
  @endforeach
@endif
평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글