이번 챕터의 코드는 https://github.com/koeunyeon/ci4/tree/model-validation 에 있습니다.
컨트롤러와 마찬가지로 모델에서도 유효성을 검사할 수 있습니다. 컨트롤러와 모델, 둘 다 유효성을 검사할 수 있다면 어디에서 유효성을 검사해야 할 지 헷깔릴 수도 있는데요. 저는 아래와 같은 규칙으로 검사합니다.
이와 같이 사용하는 이유는, 원칙상으로는 데이터를 다루는 것은 모델의 역할이기 때문입니다. 다만, 실제 데이터베이스에 저장되는 값이 아니라 연산을 위한 값들은 모델에서 검사할 수 없으므로 컨트롤러에서 검사하는 것입니다.
모델에서 유효성을 검사하는 방법을 알아보겠습니다. 풍부한 모델에서 사용한 RichModel.php
파일을 그대로 사용하겠습니다. 아래 코드 중 // 유효성 검사 규칙.
부분과 // 유효성 검사 실패시 에러 메세지.
부분을 추가합니다.
/app/Models/RichModel.php
class RichModel extends Model
{
protected $table = 'sample_rich';
protected $allowedFields = ['name', 'age'];
protected $primaryKey = "sample_rich_id";
protected $useSoftDeletes = true;
protected $useTimestamps = true;
// 유효성 검사 규칙.
protected $validationRules = [ // (1)
'name' => 'required|min_length[4]|max_length[10]',
'age' => 'required|is_natural|less_than[150]',
];
// 유효성 검사 실패시 에러 메세지.
protected $validationMessages = [ // (2)
'name' => [
'required' => '이름이 필요합니다',
'min_length' => '이름은 최소 4글자 이상입니다.',
'max_length' => '이름은 최대 10글자 이하입니다.'
],
'age' => [
'required' => '필수값입니다',
'is_natural' => "나이는 자연수여야 합니다.",
'less_than' => "정말 150세 이상이신가요?"
]
];
}
컨트롤러에서 $this->validate
구문으로 유효성을 검사했던 것과 조금 모양이 다릅니다. 모델은 내부적으로 $validationRules
멤버변수와 $validationMessages
멤버변수를 이미 부모 클래스에서 내장하고 있기 때문입니다.
코드이그나이터4의 모델은 $validationRules
변수가 빈 배열[]
이 아니라면 자동으로 insert
,update
,save
메소드 호출시 유효성을 먼저 검사합니다.
(1) name
유효성 검사 규칙을 정의합니다. 내용은 컨트롤러와 동일합니다.
(2) age
유효성 검사 규칙을 정의합니다. 내용은 컨트롤러와 동일합니다.
/app/Controllers/Rich.php
파일에 아래의 엔드포인트를 추가하겠습니다.
/app/Controllers/Rich.php
public function valid($name, $age)
{
$richModel = new RichModel();
$save_result = $richModel->save([ // (1)
'name' => $name,
'age' => $age
]);
$errors = $richModel->errors(); // (2)
return $this->response->setJSON([
'result' => $save_result,
'errors' => $errors
]);
}
(1) insert
,update
,save
메소드가 실행되면 자동으로 유효성을 검사합니다. 만약 유효성 검사에 실패하면 쿼리는 실행되지 않고 false
를 반환하게 됩니다.
(2) 오류 메세지를 가져옵니다. 만약 $save_result
가 true
라면 모델->errors()
는 빈 문자열(""
)을 리턴합니다. $save_result
가 false
라면 오류 메세지를 연관배열로 반환합니다.
http://localhost:8080/rich/valid/a/3 주소에 접속해서 오류 데이터를 확인해 봅시다.
{
"result": false,
"errors": {
"name": "이름은 최소 4글자 이상입니다."
}
}
여러 개의 유효성 검사 조건을 만족시키지 못했을 때도 확인해 보겠습니다. http://localhost:8080/rich/valid/a/300 주소에 접속합니다.
{
"result": false,
"errors": {
"name": "이름은 최소 4글자 이상입니다.",
"age": "정말 150세 이상이신가요?"
}
}
http://localhost:8080/rich/valid/abcd/3 주소에 접속해서 오류가 없을 때도 확인합니다.
{
"result": true,
"errors": ""
}