유효성 검사

CodeIgniter는 작성해야 할 코드의 양을 최소화하는 데 도움이 되는 포괄적인 데이터 유효성 검사 클래스를 제공합니다.

개요

CodeIgniter의 데이터 유효성 검사 방식을 설명하기 전에, 이상적인 시나리오를 먼저 설명하겠습니다:

  1. 폼이 표시됩니다.

  2. 폼을 작성하고 제출합니다.

  3. 유효하지 않은 값을 제출하거나 필수 항목을 빠뜨린 경우, 입력한 데이터와 함께 문제를 설명하는 오류 메시지가 포함된 폼이 다시 표시됩니다.

  4. 이 과정은 유효한 폼이 제출될 때까지 계속됩니다.

수신 측에서 스크립트는 다음을 수행해야 합니다:

  1. 필수 데이터를 확인합니다.

  2. 데이터가 올바른 유형이고 올바른 기준을 충족하는지 확인합니다. 예를 들어, 사용자 이름이 제출된 경우 허용된 문자만 포함되도록 유효성 검사를 해야 합니다. 최소 길이 이상이어야 하고, 최대 길이를 초과해서는 안 됩니다. 사용자 이름은 다른 사람의 기존 사용자 이름이거나 예약어일 수 없습니다. 등.

  3. 보안을 위해 데이터를 정제합니다.

  4. 필요한 경우 데이터를 미리 형식화합니다.

  5. 데이터베이스에 삽입할 데이터를 준비합니다.

위의 과정 자체는 특별히 복잡하지 않지만, 보통 상당한 양의 코드가 필요하며 오류 메시지를 표시하기 위해 다양한 제어 구조가 폼 HTML 안에 배치됩니다. 폼 유효성 검사는 만들기는 단순하지만 구현하기에는 일반적으로 매우 지저분하고 지루합니다.

폼 유효성 검사 튜토리얼

다음은 CodeIgniter의 폼 유효성 검사를 구현하기 위한 “실습” 튜토리얼입니다.

폼 유효성 검사를 구현하려면 세 가지가 필요합니다:

  1. 폼이 포함된 View파일.

  2. 성공적으로 제출되었을 때 표시할 “성공” 메시지가 포함된 View 파일.

  3. 제출된 데이터를 수신하고 처리하는 컨트롤러메서드.

회원 가입 폼을 예시로 이 세 가지를 만들어 보겠습니다.

텍스트 편집기를 사용하여 signup.php라는 폼을 만드십시오. 그 안에 이 코드를 넣고 app/Views/ 폴더에 저장합니다:

<html>
<head>
    <title>My Form</title>
</head>
<body>

    <?= validation_list_errors() ?>

    <?= form_open('form') ?>

        <h5>Username</h5>
        <input type="text" name="username" value="<?= set_value('username') ?>" size="50">

        <h5>Password</h5>
        <input type="text" name="password" value="<?= set_value('password') ?>" size="50">

        <h5>Password Confirm</h5>
        <input type="text" name="passconf" value="<?= set_value('passconf') ?>" size="50">

        <h5>Email Address</h5>
        <input type="text" name="email" value="<?= set_value('email') ?>" size="50">

        <div><input type="submit" value="Submit"></div>

    <?= form_close() ?>

</body>
</html>

성공 페이지

텍스트 편집기를 사용하여 success.php라는 파일을 만드십시오. 그 안에 이 코드를 넣고 app/Views/ 폴더에 저장합니다:

<html>
<head>
    <title>My Form</title>
</head>
<body>

    <h3>Your form was successfully submitted!</h3>

    <p><?= anchor('form', 'Try it again!') ?></p>

</body>
</html>

컨트롤러

텍스트 편집기를 사용하여 Form.php라는 컨트롤러를 만드십시오. 그 안에 이 코드를 넣고 app/Controllers/ 폴더에 저장합니다:

<?php

namespace App\Controllers;

class Form extends BaseController
{
    protected $helpers = ['form'];

    public function index()
    {
        if (! $this->request->is('post')) {
            return view('signup');
        }

        $rules = [
            // @TODO
        ];

        $data = $this->request->getPost(array_keys($rules));

        if (! $this->validateData($data, $rules)) {
            return view('signup');
        }

        // If you want to get the validated data.
        $validData = $this->validator->getValidated();

        return view('success');
    }
}

참고

$this->request->is()메서드는 v4.3.0부터 사용할 수 있습니다. 이전 버전에서는 if (strtolower($this->request->getMethod()) !== 'post')를 사용해야 합니다.

참고

$this->validator->getValidated()메서드는 v4.4.0부터 사용할 수 있습니다.

라우트

그런 다음 app/Config/Routes.php에서 컨트롤러의 라우트를 추가합니다:

// ...

$routes->get('form', 'Form::index');
$routes->post('form', 'Form::index');

// ...

시도해 보세요!

폼을 시험해 보려면 다음과 유사한 URL을 사용하여 사이트를 방문합니다:

example.com/index.php/form/

폼을 제출하면 단순히 폼이 다시 로드되는 것을 볼 수 있습니다. 이는 아직 $this->validateData()에 유효성 검사 규칙을 설정하지 않았기 때문입니다.

validateData() 메서드는 컨트롤러의 메서드입니다. 내부적으로 Validation 클래스를 사용합니다. $this->validateData()를 참조하십시오.

참고

아직 validateData() 메서드에 무엇을 검사할지 지정하지 않았기 때문에 기본적으로 false (불리언 false)를 반환합니다. validateData() 메서드는 규칙을 성공적으로 적용하고 어떤 규칙도 실패하지 않은 경우에만 true를 반환합니다.

설명

위의 페이지들에서 몇 가지 사항을 알 수 있습니다.

signup.php

폼(signup.php)은 몇 가지 예외가 있는 표준 웹 폼입니다:

  1. 폼 헬퍼를 사용하여 폼의 시작과 끝을 생성합니다. 기술적으로 이것이 필수는 아닙니다. 표준 HTML을 사용하여 폼을 만들 수도 있습니다. 그러나 헬퍼를 사용하면 설정 파일의 URL을 기반으로 action URL을 자동으로 생성해 주는 이점이 있습니다. 이는 URL이 변경될 경우 애플리케이션의 이식성을 높여줍니다.

  2. 폼 상단에서 다음과 같은 함수 호출을 볼 수 있습니다:

    <?= validation_list_errors() ?>
    

    이 함수는 유효성 검사기가 반환한 오류 메시지를 반환합니다. 메시지가 없으면 빈 문자열을 반환합니다.

Form.php

컨트롤러(Form.php)에는 하나의 프로퍼티인 $helpers가 있습니다. 이것은 뷰 파일에서 사용하는 폼 헬퍼를 로드합니다.

컨트롤러에는 index()라는 하나의 메서드가 있습니다. 이 메서드는 POST가 아닌 요청이 오면 signup 뷰를 반환하여 폼을 표시합니다. 그렇지 않으면 컨트롤러가 제공하는 $this->validateData()메서드를 사용합니다. 또한 유효성 검사 루틴을 실행합니다. 유효성 검사 성공 여부에 따라 폼이나 성공 페이지를 표시합니다.

유효성 검사 규칙 추가

그런 다음 컨트롤러(Form.php)에 유효성 검사 규칙을 추가합니다:

// ...

$rules = [
    'username' => 'required|max_length[30]',
    'password' => 'required|max_length[255]|min_length[10]',
    'passconf' => 'required|max_length[255]|matches[password]',
    'email'    => 'required|max_length[254]|valid_email',
];

// ...

폼을 제출하면 성공 페이지 또는 오류 메시지가 있는 폼이 표시됩니다.

유효성 검사 설정

전통적 규칙과 엄격한 규칙

CodeIgniter 4에는 두 가지 종류의 유효성 검사 규칙 클래스가 있습니다.

기본 규칙 클래스(Strict Rules)는 CodeIgniter\Validation\StrictRules 네임스페이스를 가지며, 엄격한 유효성 검사를 제공합니다.

전통적인 규칙 클래스(Traditional Rules)는 CodeIgniter\Validation 네임스페이스를 가집니다. 하위 호환성을 위해서만 제공됩니다. 문자열이 아닌 값의 유효성 검사가 올바르지 않을 수 있으므로 새 프로젝트에서는 사용하지 않아도 됩니다.

참고

v4.3.0부터 보안 강화를 위해 Strict Rules가 기본적으로 사용됩니다.

엄격한 규칙(Strict Rules)

Added in version 4.2.0.

Strict Rules는 암묵적 타입 변환을 사용하지 않습니다.

전통적 규칙(Traditional Rules)

중요

Traditional Rules는 하위 호환성을 위해서만 존재합니다. 새 프로젝트에서는 사용하지 마십시오. 이미 사용 중이라면 Strict Rules로 전환할 것을 권장합니다.

경고

JSON 데이터와 같이 문자열이 아닌 값이 포함된 데이터의 유효성을 검사할 때는 Strict Rules를 사용해야 합니다.

Traditional Rules는 문자열 값이 검사된다고 암묵적으로 가정하며, 입력 값이 암묵적으로 문자열 값으로 변환될 수 있습니다. POST 데이터 유효성 검사와 같은 대부분의 기본적인 경우에는 잘 동작합니다.

그러나 예를 들어 JSON 입력 데이터를 사용하는 경우, bool/null/array 타입이 될 수 있습니다. 불리언 true를 검사하면 Traditional 규칙 클래스에서 문자열 '1'로 변환됩니다. integer 규칙으로 검사하면 '1'이 유효성 검사를 통과합니다.

Traditional Rules 사용

경고

Traditional Rules는 하위 호환성을 위해서만 제공됩니다. 문자열이 아닌 값의 유효성 검사가 올바르지 않을 수 있으므로 새 프로젝트에서는 사용하지 않아도 됩니다.

전통적인 규칙을 사용하려면 app/Config/Validation.php에서 규칙 클래스를 변경해야 합니다:

<?php

namespace Config;

// ...

class Validation extends BaseConfig
{
    // ...

    public array $ruleSets = [
        \CodeIgniter\Validation\CreditCardRules::class,
        \CodeIgniter\Validation\FileRules::class,
        \CodeIgniter\Validation\FormatRules::class,
        \CodeIgniter\Validation\Rules::class,
    ];

    // ...
}

라이브러리 로드

라이브러리는 validation이라는 서비스로 로드됩니다:

$validation = service('validation');

이렇게 하면 여러 Ruleset을 포함하는 설정과 쉽게 재사용할 수 있는 규칙 모음이 담긴 Config\Validation 파일이 자동으로 로드됩니다.

참고

컨트롤러모델 모두 유효성 검사를 더 쉽게 만드는 메서드를 제공하므로 이 방법을 사용할 필요가 없을 수도 있습니다.

유효성 검사 동작 방식

  • 유효성 검사는 검사할 데이터를 절대 변경하지 않습니다.

  • 유효성 검사는 설정한 유효성 검사 규칙에 따라 각 필드를 순서대로 확인합니다. 어떤 규칙이 false를 반환하면, 해당 필드의 검사는 거기서 종료됩니다.

  • 형식 규칙(Format Rules)은 빈 문자열을 허용하지 않습니다. 빈 문자열을 허용하려면 permit_empty 규칙을 추가하십시오.

  • 검사할 데이터에 필드가 존재하지 않으면 값이 null로 해석됩니다. 필드가 존재하는지 확인하려면 field_exists 규칙을 추가하십시오.

참고

field_exists 규칙은 v4.5.0부터 사용할 수 있습니다.

유효성 검사 규칙 설정

CodeIgniter를 사용하면 주어진 필드에 필요한 만큼 유효성 검사 규칙을 순서대로 연속적으로 설정할 수 있습니다. 유효성 검사 규칙을 설정하려면 setRule(), setRules(), 또는 withRequest() 메서드를 사용합니다.

단일 규칙 설정

setRule()

이 메서드는 단일 규칙을 설정합니다. 메서드 시그니처는 다음과 같습니다:

setRule(string $field, ?string $label, array|string $rules[, array $errors = []])

$rules는 파이프로 구분된 규칙 목록 또는 규칙 배열을 받습니다:

$validation->setRule('username', 'Username', 'required|max_length[30]|min_length[3]');
$validation->setRule('password', 'Password', ['required', 'max_length[255]', 'min_length[8]', 'alpha_numeric_punct']);

$field에 전달하는 값은 전송된 데이터 배열의 키와 일치해야 합니다. 데이터가 $_POST에서 직접 가져온 경우 폼 입력 이름과 정확히 일치해야 합니다.

경고

v4.2.0 이전에는 이 메서드의 세 번째 매개변수 $rulesstring을 받도록 타입힌트되어 있었습니다. v4.2.0 이후에는 배열도 허용하기 위해 타입힌트가 제거되었습니다. 이 메서드를 재정의하는 하위 클래스에서 LSP가 깨지는 것을 방지하려면 하위 클래스의 메서드에서도 타입힌트를 제거해야 합니다.

여러 규칙 설정

setRules()

setRule()와 비슷하지만 필드 이름과 규칙의 배열을 받습니다:

$validation->setRules([
    'username' => 'required|max_length[30]',
    'password' => 'required|max_length[255]|min_length[10]',
]);
// or
$validation->setRules([
    'username' => ['required', 'max_length[30]'],
    'password' => ['required', 'max_length[255]', 'min_length[10]'],
]);

레이블이 있는 오류 메시지를 제공하려면 다음과 같이 설정할 수 있습니다:

$validation->setRules([
    'username' => ['label' => 'Username', 'rules' => 'required|max_length[30]'],
    'password' => ['label' => 'Password', 'rules' => 'required|max_length[255]|min_length[10]'],
]);
// or
$validation->setRules([
    'username' => ['label' => 'Username', 'rules' => 'required|max_length[30]'],
    'password' => ['label' => 'Password', 'rules' => ['required', 'max_length[255]', 'min_length[10]']],
]);

참고

setRules()는 이전에 설정된 모든 규칙을 덮어씁니다. 기존 규칙 집합에 규칙을 추가하려면 setRule()을 여러 번 사용하십시오.

배열 데이터에 대한 규칙 설정

데이터가 중첩 연관 배열 형태라면 “점 배열 구문(dot array syntax)”을 사용하여 쉽게 유효성 검사를 할 수 있습니다:

/*
 * The data to test:
 * [
 *     'contacts' => [
 *         'name' => 'Joe Smith',
 *         'friends' => [
 *             [
 *                 'name' => 'Fred Flinstone',
 *             ],
 *             [
 *                 'name' => 'Wilma',
 *             ],
 *         ]
 *     ]
 * ]
 */

// Joe Smith
$validation->setRules([
    'contacts.name' => 'required|max_length[60]',
]);

* 와일드카드 기호를 사용하여 배열의 한 레벨을 일치시킬 수 있습니다:

// Fred Flintsone & Wilma
$validation->setRules([
    'contacts.friends.*.name' => 'required|max_length[60]',
]);

참고

v4.4.4 이전에는 버그로 인해 와일드카드 *가 잘못된 차원의 데이터를 검사했습니다. 자세한 내용은 업그레이드를 참조하십시오.

“점 배열 구문”은 단일 차원 배열 데이터가 있을 때도 유용합니다. 예를 들어, 다중 선택 드롭다운에서 반환된 데이터:

/*
 * The data to test:
 * [
 *     'user_ids' => [
 *         1,
 *         2,
 *         3,
 *     ]
 * ]
 */

// Rule
$validation->setRules([
    'user_ids.*' => 'required|max_length[19]',
]);

withRequest()

중요

이 메서드는 하위 호환성을 위해서만 존재합니다. 새 프로젝트에서는 사용하지 마십시오. 이미 사용 중이라면 더 적절한 다른 메서드를 사용할 것을 권장합니다.

경고

POST 데이터만 검사하려면 withRequest()를 사용하지 마십시오. 이 메서드는 $request->getVar()를 사용하며, $_GET, $_POST 또는 $_COOKIE 데이터를 해당 순서로 반환합니다 (php.ini request-order 에 따라 다름). 최신 값이 이전 값을 덮어씁니다. 같은 이름의 쿠키가 있으면 POST 값이 쿠키에 의해 덮어써질 수 있습니다.

유효성 검사 라이브러리를 가장 일반적으로 사용하는 경우는 HTTP 요청에서 입력된 데이터를 검사할 때입니다. 원하는 경우 현재 Request 객체의 인스턴스를 전달하면 모든 입력 데이터를 가져와 검사할 데이터로 설정합니다:

$validation = service('validation');
$request    = service('request');

if ($validation->withRequest($request)->run()) {
    // If you use the input data, you should get it from the getValidated() method.
    // Otherwise you may create a vulnerability.
    $validData = $validation->getValidated();

    // ...
}

경고

이 메서드를 사용할 때는 getValidated()메서드를 사용하여 검사된 데이터를 가져와야 합니다. 이 메서드는 요청이 JSON 요청(Content-Type: application/json)인 경우 $request->getJSON()에서 JSON 데이터를 가져오거나, 요청이 PUT, PATCH, DELETE 요청이고 HTML 폼 전송(Content-Type: multipart/form-data)이 아닌 경우 $request->getRawInput()에서 Raw 데이터를 가져오거나, $request->getVar()에서 데이터를 가져오기 때문에 공격자가 검사되는 데이터를 변경할 수 있습니다.

참고

getValidated()메서드는 v4.4.0부터 사용할 수 있습니다.

유효성 검사 작업

유효성 검사 실행

run() 메서드는 유효성 검사를 실행합니다. 메서드 시그니처는 다음과 같습니다:

run(?array $data = null, ?string $group = null, ?string $dbGroup = null): bool

$data는 검사할 데이터 배열입니다. 선택적 두 번째 매개변수 $group은 적용할 사전 정의된 규칙 그룹입니다. 선택적 세 번째 매개변수 $dbGroup은 사용할 데이터베이스 그룹입니다.

이 메서드는 유효성 검사가 성공하면 true를 반환합니다.

if (! $validation->run($data)) {
    // handle validation errors
}
// or
if (! $validation->run($data, 'signup')) {
    // handle validation errors
}

여러 번 유효성 검사 실행

참고

run() 메서드는 오류 상태를 초기화하지 않습니다. 이전 실행이 실패한 경우 run()은 항상 false를 반환하고, 명시적으로 초기화하기 전까지 getErrors()는 모든 이전 오류를 반환합니다.

서로 다른 데이터 집합이나 다른 규칙으로 여러 번 유효성 검사를 실행하려는 경우, 이전 실행의 오류를 제거하기 위해 각 실행 전에 $validation->reset()을 호출해야 할 수 있습니다. reset()은 이전에 설정한 모든 데이터, 규칙 또는 사용자 정의 오류를 무효화하므로 setRules(), setRuleGroup() 등을 반복해야 한다는 점에 유의하십시오:

foreach ($userAccounts as $user) {
    $validation->reset();
    $validation->setRules($userAccountRules);

    if (! $validation->run($user)) {
        // handle validation errors
    }
}

단일 값 유효성 검사

check() 메서드는 규칙에 따라 하나의 값을 검사합니다. 첫 번째 매개변수 $value는 검사할 값입니다. 두 번째 매개변수 $rule은 유효성 검사 규칙입니다. 선택적 세 번째 매개변수 $errors는 사용자 정의 오류 메시지입니다.

if ($validation->check($value, 'required')) {
    // $value is valid.
}

참고

v4.4.0 이전에는 이 메서드의 두 번째 매개변수 $rulestring을 받도록 타입힌트되어 있었습니다. v4.4.0 이후에는 배열도 허용하기 위해 타입힌트가 제거되었습니다.

참고

이 메서드는 내부적으로 setRule() 메서드를 호출하여 규칙을 설정합니다.

검사된 데이터 가져오기

Added in version 4.4.0.

실제 검사된 데이터는 getValidated() 메서드로 가져올 수 있습니다. 이 메서드는 유효성 검사 규칙에 의해 검사된 요소만 포함된 배열을 반환합니다.

$validation = service('validation');
$validation->setRules([
    'username' => 'required',
    'password' => 'required|min_length[10]',
]);

$data = [
    'username'   => 'john',
    'password'   => 'BPi-$Swu7U5lm$dX',
    'csrf_token' => '8b9218a55906f9dcc1dc263dce7f005a',
];

if ($validation->run($data)) {
    $validatedData = $validation->getValidated();
    // $validatedData = [
    //     'username' => 'john',
    //     'password' => 'BPi-$Swu7U5lm$dX',
    // ];
}
// In Controller.

if (! $this->validateData($data, [
    'username' => 'required',
    'password' => 'required|min_length[10]',
])) {
    // The validation failed.
    return view('login', [
        'errors' => $this->validator->getErrors(),
    ]);
}

// The validation was successful.

// Get the validated data.
$validData = $this->validator->getValidated();

설정 파일에 유효성 검사 규칙 저장

Validation 클래스의 유용한 기능 중 하나는 애플리케이션 전체의 모든 유효성 검사 규칙을 설정 파일에 저장할 수 있다는 것입니다. 규칙을 “그룹”으로 구성합니다. 유효성 검사를 실행할 때마다 다른 그룹을 지정할 수 있습니다.

규칙 저장 방법

유효성 검사 규칙을 저장하려면 Config\Validation 클래스에 그룹 이름으로 새 public 프로퍼티를 만들기만 하면 됩니다. 이 요소는 유효성 검사 규칙이 담긴 배열을 가집니다. 앞서 보여준 것처럼 유효성 검사 배열은 다음과 같은 형태입니다:

<?php

namespace Config;

// ...

class Validation extends BaseConfig
{
    // ...

    public array $signup = [
        'username'     => 'required|max_length[30]',
        'password'     => 'required|max_length[255]',
        'pass_confirm' => 'required|max_length[255]|matches[password]',
        'email'        => 'required|max_length[254]|valid_email',
    ];

    // ...
}

규칙 그룹 지정 방법

run() 메서드를 호출할 때 사용할 그룹을 지정할 수 있습니다:

$validation->run($data, 'signup');

오류 메시지 저장 방법

그룹과 같은 이름에 _errors를 추가하여 프로퍼티 이름을 지정하면 이 설정 파일에 사용자 정의 오류 메시지도 저장할 수 있습니다. 이 그룹이 사용될 때 오류에 자동으로 적용됩니다:

<?php

namespace Config;

// ...

class Validation extends BaseConfig
{
    // ...

    public array $signup = [
        'username'     => 'required|max_length[30]',
        'password'     => 'required|max_length[255]',
        'pass_confirm' => 'required|max_length[255]|matches[password]',
        'email'        => 'required|max_length[254]|valid_email',
    ];

    public array $signup_errors = [
        'username' => [
            'required' => 'You must choose a username.',
        ],
        'email' => [
            'valid_email' => 'Please check the Email field. It does not appear to be valid.',
        ],
    ];

    // ...
}

또는 모든 설정을 배열로 전달합니다:

<?php

namespace Config;

// ...

class Validation extends BaseConfig
{
    // ...

    public array $signup = [
        'username' => [
            'rules'  => 'required|max_length[30]',
            'errors' => [
                'required' => 'You must choose a Username.',
            ],
        ],
        'email' => [
            'rules'  => 'required|max_length[254]|valid_email',
            'errors' => [
                'valid_email' => 'Please check the Email field. It does not appear to be valid.',
            ],
        ],
    ];

    // ...
}

배열 형식에 대한 자세한 내용은 사용자 정의 오류 메시지 설정를 참조하십시오.

규칙 그룹 가져오기 및 설정

규칙 그룹 가져오기

이 메서드는 유효성 검사 설정에서 규칙 그룹을 가져옵니다:

$validation->getRuleGroup('signup');
규칙 그룹 설정

이 메서드는 유효성 검사 설정의 규칙 그룹을 유효성 검사 서비스에 설정합니다:

$validation->setRuleGroup('signup');

유효성 검사 플레이스홀더

Validation 클래스는 전달되는 데이터를 기반으로 규칙의 일부를 대체하는 간단한 방법을 제공합니다. 다소 모호하게 들릴 수 있지만 is_unique 유효성 검사 규칙에서 특히 유용합니다.

플레이스홀더는 단순히 $data로 전달된 필드 이름(또는 배열 키)을 중괄호로 감싼 것입니다. 일치하는 수신 필드의 으로 대체됩니다. 예시를 통해 이를 명확히 하겠습니다:

$validation->setRules([
    'id'    => 'max_length[19]|is_natural_no_zero',
    'email' => 'required|max_length[254]|valid_email|is_unique[users.email,id,{id}]',
]);

경고

v4.3.5부터는 보안상의 이유로 플레이스홀더 필드(위 샘플 코드의 id 필드)에 대한 유효성 검사 규칙을 설정해야 합니다. 공격자가 애플리케이션에 임의의 데이터를 전송할 수 있기 때문입니다.

이 규칙 집합에서는 플레이스홀더 값과 일치하는 id를 가진 행을 제외하고 데이터베이스에서 이메일 주소가 고유해야 한다고 명시합니다. 폼 POST 데이터가 다음과 같다고 가정합니다:

$_POST = [
    'id'    => 4,
    'email' => 'foo@example.com',
];

그러면 {id} 플레이스홀더가 숫자 4로 대체되어 다음과 같이 수정된 규칙이 됩니다:

$validation->setRules([
    'id'    => 'max_length[19]|is_natural_no_zero',
    'email' => 'required|max_length[254]|valid_email|is_unique[users.email,id,4]',
]);

따라서 이메일이 고유한지 확인할 때 id=4인 행은 무시합니다.

참고

v4.3.5부터 플레이스홀더(id) 값이 유효성 검사를 통과하지 못하면 플레이스홀더는 대체되지 않습니다.

전달되는 동적 키가 폼 데이터와 충돌하지 않도록 주의하면, 런타임에 더 동적인 규칙을 만드는 데에도 사용할 수 있습니다.

오류 처리

Validation 라이브러리는 오류 메시지를 설정하고, 사용자 정의 오류 메시지를 제공하며, 표시할 하나 이상의 오류를 가져오는 데 도움이 되는 여러 메서드를 제공합니다.

기본적으로 오류 메시지는 각 규칙에 항목이 있는 system/Language/en/Validation.php의 언어 문자열에서 파생됩니다. 메시지 기본값을 변경하려면 app/Language/en/Validation.php 파일(및/또는 en 대신 또는 함께 사용하는 로케일의 해당 폴더)을 만들고 다른 기본값을 원하는 오류 메시지의 키와 값을 넣으십시오.

사용자 정의 오류 메시지 설정

setRule()setRules() 메서드 모두 마지막 매개변수로 각 필드에 특정한 오류로 사용될 사용자 정의 메시지 배열을 받을 수 있습니다. 오류가 각 인스턴스에 맞게 조정되어 사용자에게 매우 좋은 경험을 제공합니다. 사용자 정의 오류 메시지가 제공되지 않으면 기본값이 사용됩니다.

사용자 정의 오류 메시지를 제공하는 두 가지 방법이 있습니다.

마지막 매개변수로:

$validation->setRules(
    [
        'username' => 'required|max_length[30]|is_unique[users.username]',
        'password' => 'required|max_length[254]|min_length[10]',
    ],
    [   // Errors
        'username' => [
            'required' => 'All accounts must have usernames provided',
        ],
        'password' => [
            'min_length' => 'Your password is too short. You want to get hacked?',
        ],
    ],
);

또는 레이블 스타일로:

$validation->setRules([
    'username' => [
        'label'  => 'Username',
        'rules'  => 'required|max_length[30]|is_unique[users.username]',
        'errors' => [
            'required' => 'All accounts must have {field} provided',
        ],
    ],
    'password' => [
        'label'  => 'Password',
        'rules'  => 'required|max_length[255]|min_length[10]',
        'errors' => [
            'min_length' => 'Your {field} is too short. You want to get hacked?',
        ],
    ],
]);

필드의 “사람이 읽기 좋은” 이름, 일부 규칙이 허용하는 선택적 매개변수(예: max_length), 또는 검사된 값을 포함하려면 메시지에 각각 {field}, {param}, {value} 태그를 추가할 수 있습니다:

'min_length' => 'Supplied value ({value}) for {field} must have at least {param} characters.'

사람이 읽기 좋은 이름이 Username이고 min_length[6] 규칙에 “Pizza” 값을 가진 필드의 경우, 오류는 다음과 같이 표시됩니다: “Username에 대해 제공된 값 (Pizza)은 최소 6자 이상이어야 합니다.”

경고

getErrors()getError()로 오류 메시지를 가져올 때 메시지는 HTML 이스케이프되지 않습니다. ({value})와 같이 사용자 입력 데이터를 사용하여 오류 메시지를 만들면 HTML 태그가 포함될 수 있습니다. 메시지를 표시하기 전에 이스케이프하지 않으면 XSS 공격이 가능합니다.

참고

레이블 스타일 오류 메시지를 사용할 때 setRules()에 두 번째 매개변수를 전달하면 첫 번째 매개변수의 값으로 덮어써집니다.

메시지 및 유효성 검사 레이블 번역

언어 파일에서 번역된 문자열을 사용하려면 점 구문을 간단히 사용하면 됩니다. app/Languages/en/Rules.php에 번역이 있는 파일이 있다고 가정합니다. 이 파일에 정의된 언어 라인을 다음과 같이 사용할 수 있습니다:

$validation->setRules([
    'username' => [
        'label'  => 'Rules.username',
        'rules'  => 'required|max_length[30]|is_unique[users.username]',
        'errors' => [
            'required' => 'Rules.username.required',
        ],
    ],
    'password' => [
        'label'  => 'Rules.password',
        'rules'  => 'required|max_length[255]|min_length[10]',
        'errors' => [
            'min_length' => 'Rules.password.min_length',
        ],
    ],
]);

모든 오류 가져오기

실패한 필드의 모든 오류 메시지를 가져오려면 getErrors() 메서드를 사용할 수 있습니다:

$errors = $validation->getErrors();
/*
 * Produces:
 * [
 *     'field1' => 'error message',
 *     'field2' => 'error message',
 * ]
 */

오류가 없으면 빈 배열이 반환됩니다.

와일드카드(*)를 사용할 때 오류는 별표를 적절한 키로 대체하여 특정 필드를 가리킵니다:

// for data
'contacts' => [
    'friends' => [
        [
            'name' => 'Fred Flinstone',
        ],
        [
            'name' => '',
        ],
    ]
]

// rule
'contacts.friends.*.name' => 'required'

// error will be
'contacts.friends.1.name' => 'The contacts.friends.*.name field is required.'

단일 오류 가져오기

getError() 메서드로 단일 필드의 오류를 가져올 수 있습니다. 유일한 매개변수는 필드 이름입니다:

$error = $validation->getError('username');

오류가 없으면 빈 문자열이 반환됩니다.

참고

와일드카드를 사용할 때 마스크와 일치하는 모든 오류는 EOL 문자로 구분된 한 줄로 합쳐집니다.

오류 존재 여부 확인

hasError() 메서드로 오류가 있는지 확인할 수 있습니다. 유일한 매개변수는 필드 이름입니다:

if ($validation->hasError('username')) {
    echo $validation->getError('username');
}

와일드카드가 있는 필드를 지정할 때 마스크와 일치하는 모든 오류가 확인됩니다:

/*
 * For errors:
 * [
 *     'foo.0.bar'   => 'Error',
 *     'foo.baz.bar' => 'Error',
 * ]
 */

// returns true
$validation->hasError('foo.*.bar');

리디렉션과 유효성 검사 오류

PHP는 요청 간에 아무것도 공유하지 않습니다. 따라서 유효성 검사가 실패했을 때 리디렉션하면 유효성 검사가 이전 요청에서 실행되었기 때문에 리디렉션된 요청에는 유효성 검사 오류가 없습니다.

이 경우 폼 헬퍼 함수 validation_errors(), validation_list_errors(), validation_show_error()를 사용해야 합니다. 이 함수들은 세션에 저장된 유효성 검사 오류를 확인합니다.

유효성 검사 오류를 세션에 저장하려면 redirect()와 함께 withInput()을 사용해야 합니다:

// In Controller.
if (! $this->validateData($data, $rules)) {
    return redirect()->back()->withInput();
}

오류 표시 사용자 정의

$validation->listErrors()$validation->showError()를 호출하면 백그라운드에서 오류 표시 방법을 결정하는 뷰 파일을 로드합니다. 기본적으로 래핑 div에 errors 클래스를 사용하여 표시됩니다. 새 뷰를 쉽게 만들어 애플리케이션 전체에서 사용할 수 있습니다.

뷰 만들기

첫 번째 단계는 사용자 정의 뷰를 만드는 것입니다. view() 메서드가 찾을 수 있는 어디든 배치할 수 있으며, 표준 View 디렉터리나 네임스페이스가 있는 View 폴더 모두 사용 가능합니다. 예를 들어, app/Views/_errors_list.php에 새 뷰를 만들 수 있습니다:

<?php if (! empty($errors)): ?>
    <div class="alert alert-danger" role="alert">
        <ul>
        <?php foreach ($errors as $error): ?>
            <li><?= esc($error) ?></li>
        <?php endforeach ?>
        </ul>
    </div>
<?php endif ?>

뷰 내에서 $errors라는 배열을 사용할 수 있으며, 키는 오류가 있는 필드 이름이고 값은 오류 메시지인 오류 목록을 포함합니다:

$errors = [
    'username' => 'The username field must be unique.',
    'email'    => 'You must provide a valid email address.',
];

실제로 만들 수 있는 뷰에는 두 가지 유형이 있습니다. 첫 번째는 방금 살펴본 것처럼 모든 오류의 배열을 가집니다. 다른 유형은 더 단순하며, 오류 메시지를 담는 단일 변수 $error만 포함합니다. 이것은 필드를 지정해야 하는 showError() 메서드와 함께 사용됩니다:

<span class="help-block"><?= esc($error) ?></span>

설정

뷰를 만든 후에는 Validation 라이브러리에 알려야 합니다. app/Config/Validation.php를 여십시오. 안에는 원하는 만큼 사용자 정의 뷰를 나열하고 참조할 수 있는 짧은 별칭을 제공할 수 있는 $templates 프로퍼티가 있습니다. 위의 예시 파일을 추가하면 다음과 같이 됩니다:

<?php

namespace Config;

// ...

class Validation extends BaseConfig
{
    // ...

    public array $templates = [
        'list'    => 'CodeIgniter\Validation\Views\list',
        'single'  => 'CodeIgniter\Validation\Views\single',
        'my_list' => '_errors_list',
    ];

    // ...
}

템플릿 지정

listErrors()의 첫 번째 매개변수로 별칭을 전달하여 사용할 템플릿을 지정할 수 있습니다:

<?= $validation->listErrors('my_list') ?>

필드별 오류를 표시할 때 오류가 속해야 하는 필드 이름 바로 뒤에 showError() 메서드의 두 번째 매개변수로 별칭을 전달할 수 있습니다:

<?= $validation->showError('username', 'my_single') ?>

사용자 정의 규칙 만들기

규칙 클래스 사용

규칙은 간단한 네임스페이스 클래스 안에 저장됩니다. 오토로더가 찾을 수 있는 한 원하는 어느 위치에든 저장할 수 있습니다. 이 파일들을 RuleSet이라고 합니다.

RuleSet 추가

새 RuleSet을 추가하려면 app/Config/Validation.php를 편집하고 새 파일을 $ruleSets 배열에 추가합니다:

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;
use CodeIgniter\Validation\CreditCardRules;
use CodeIgniter\Validation\FileRules;
use CodeIgniter\Validation\FormatRules;
use CodeIgniter\Validation\Rules;

class Validation extends BaseConfig
{
    // ...

    public array $ruleSets = [
        Rules::class,
        FormatRules::class,
        FileRules::class,
        CreditCardRules::class,
    ];

    // ...
}

완전한 클래스 이름의 단순 문자열로 추가하거나, 위에서 보여준 것처럼 ::class 접미사를 사용하여 추가할 수 있습니다. ::class 접미사를 사용하는 주요 이점은 고급 IDE에서 추가적인 탐색 기능을 제공한다는 것입니다.

규칙 클래스 만들기

파일 자체에서 각 메서드는 규칙이며, 첫 번째 매개변수로 검사할 값을 받아야 하고, 테스트를 통과하면 true, 그렇지 않으면 false인 불리언 값을 반환해야 합니다:

<?php

class MyRules
{
    public function even($value): bool
    {
        return (int) $value % 2 === 0;
    }
}

기본적으로 시스템은 오류 내에서 사용되는 언어 문자열을 system/Language/en/Validation.php에서 찾습니다. 사용자 정의 규칙의 기본 오류 메시지를 제공하려면 app/Language/en/Validation.php**(및/또는 ``en`` 대신 사용하는 로케일의 해당 폴더)에 배치할 수 있습니다. 또한 기본 **Validation.php 대신 다른 언어 문자열 파일을 사용하려면 두 번째(또는 규칙이 아래 설명된 매개변수와 함께 작동해야 하는 경우 네 번째) 매개변수에서 &$error 변수를 참조로 받아 오류 메시지를 제공할 수 있습니다:

<?php

class MyRules
{
    public function even($value, ?string &$error = null): bool
    {
        if ((int) $value % 2 !== 0) {
            $error = lang('myerrors.evenError');

            return false;
        }

        return true;
    }
}

사용자 정의 규칙 사용

새로운 사용자 정의 규칙은 이제 다른 규칙과 마찬가지로 사용할 수 있습니다:

$validation->setRules([
    'foo' => 'required|max_length[19]|even',
]);

매개변수 허용

메서드가 매개변수와 함께 작동해야 하는 경우 함수에는 최소 세 개의 매개변수가 필요합니다:

  1. 검사할 값 ($value)

  2. 매개변수 문자열 ($params)

  3. 폼에서 제출된 모든 데이터가 있는 배열 ($data)

  4. (선택적) 위에서 설명한 것처럼 사용자 정의 오류 문자열 (&$error).

경고

$data의 필드 값은 검사되지 않았거나 유효하지 않을 수 있습니다. 검사되지 않은 입력 데이터를 사용하는 것은 취약점의 원인이 됩니다. $data의 데이터를 사용하기 전에 사용자 정의 규칙 내에서 필요한 유효성 검사를 수행해야 합니다.

$data 배열은 결과를 결정하기 위해 다른 제출된 필드의 값을 확인해야 하는 required_with와 같은 규칙에 특히 유용합니다:

<?php

class MyRules
{
    public function required_with($value, string $params, array $data): bool
    {
        $params = explode(',', $params);

        // If the field is present we can safely assume that
        // the field is here, no matter whether the corresponding
        // search field is present or not.
        $present = $this->required($value ?? '');

        if ($present) {
            return true;
        }

        // Still here? Then we fail this test if
        // any of the fields are present in $data
        // as $fields in the list
        $requiredFields = [];

        foreach ($params as $field) {
            if (array_key_exists($field, $data)) {
                $requiredFields[] = $field;
            }
        }

        // Remove any keys with empty values since, that means they
        // weren't truly there, as far as this is concerned.
        $requiredFields = array_filter($requiredFields, static fn ($item) => ! empty($data[$item]));

        return empty($requiredFields);
    }
}

클로저 규칙 사용

Added in version 4.3.0.

애플리케이션 전체에서 사용자 정의 규칙의 기능이 한 번만 필요하다면 규칙 클래스 대신 클로저를 사용할 수 있습니다.

유효성 검사 규칙에는 배열을 사용해야 합니다:

$validation->setRules(
    [
        'foo' => [
            'required',
            static fn ($value) => (int) $value % 2 === 0,
        ],
    ],
    [
        // Errors
        'foo' => [
            // Specify the array key for the closure rule.
            1 => 'The value is not even.',
        ],
    ],
);

if (! $validation->run($data)) {
    // handle validation errors
}

클로저 규칙에 대한 오류 메시지를 설정해야 합니다. 오류 메시지를 지정할 때 클로저 규칙의 배열 키를 설정합니다. 위 코드에서 required 규칙의 키는 0이고, 클로저의 키는 1입니다.

또는 다음 매개변수를 사용할 수 있습니다:

$validation->setRules([
    'foo' => [
        'required',
        static function ($value, $data, &$error, $field) {
            if ((int) $value % 2 === 0) {
                return true;
            }

            $error = 'The value is not even.';

            return false;
        },
    ],
]);

콜러블 규칙 사용

Added in version 4.5.0.

배열 콜백을 규칙으로 사용하려면 클로저 규칙 대신 사용할 수 있습니다.

유효성 검사 규칙에는 배열을 사용해야 합니다:

namespace App\Controllers;

class Form extends BaseController
{
    // Define a custom validation rule.
    public function _ruleEven($value): bool
    {
        return (int) $value % 2 === 0;
    }

    public function process()
    {
        // ...

        $validation = service('validation');
        $validation->setRules(
            [
                'foo' => [
                    'required',
                    // Specify the method in this controller as a rule.
                    [$this, '_ruleEven'],
                ],
            ],
            [
                // Errors
                'foo' => [
                    // Specify the array key for the callable rule.
                    1 => 'The value is not even.',
                ],
            ],
        );

        if (! $validation->run($data)) {
            // handle validation errors
        }

        // ...
    }
}

콜러블 규칙에 대한 오류 메시지를 설정해야 합니다. 오류 메시지를 지정할 때 콜러블 규칙의 배열 키를 설정합니다. 위 코드에서 required 규칙의 키는 0이고, 콜러블의 키는 1입니다.

또는 다음 매개변수를 사용할 수 있습니다:

namespace App\Controllers;

use Config\Services;

class Form extends BaseController
{
    // Define a custom validation rule.
    public function _ruleEven($value, $data, &$error, $field): bool
    {
        if ((int) $value % 2 === 0) {
            return true;
        }

        $error = 'The value is not even.';

        return false;
    }

    // ...
}

사용 가능한 규칙

참고

규칙은 문자열입니다. 특히 is_unique 규칙에서 매개변수 사이에 공백이 없어야 합니다. ignore_value 앞뒤에도 공백이 없어야 합니다.

// is_unique[table.field,ignore_field,ignore_value]

$validation->setRules([
    'name' => "max_length[36]|is_unique[supplier.name,uuid, {$uuid}]", // is not ok
    'name' => "max_length[36]|is_unique[supplier.name,uuid,{$uuid} ]", // is not ok
    'name' => "max_length[36]|is_unique[supplier.name,uuid,{$uuid}]",  // is ok
    'name' => 'max_length[36]|is_unique[supplier.name,uuid,{uuid}]',   // is ok - see "Validation Placeholders"
]);
// Warning: If `$uuid` is a user input, be sure to validate the format of the value before using it.
// Otherwise, it is vulnerable.

일반 사용 규칙

다음은 사용 가능한 모든 기본 규칙의 목록입니다:

규칙

매개변수

설명

예시

alpha

아니요

필드에 ASCII 알파벳 문자 이외의 것이 있거나 비어 있으면 실패합니다.

alpha_dash

아니요

필드에 ASCII 영숫자, 밑줄 또는 대시 이외의 것이 포함되어 있거나 비어 있으면 실패합니다.

alpha_numeric

아니요

필드에 ASCII 영숫자 문자 이외의 것이 포함되어 있거나 비어 있으면 실패합니다.

alpha_numeric_punct

아니요

필드에 영숫자, 공백, 다음의 제한된 구두점 문자: ~ (물결표), ! (느낌표), # (숫자), $ (달러), % (퍼센트), & (앰퍼샌드), * (별표), - (대시), _ (밑줄), + (더하기), = (등호), | (수직 막대), : (콜론), . (마침표) 이외의 것이 포함되어 있거나 비어 있으면 실패합니다.

alpha_numeric_space

아니요

필드에 ASCII 영숫자 또는 공백 문자 이외의 것이 포함되어 있거나 비어 있으면 실패합니다.

alpha_space

아니요

필드에 ASCII 알파벳 문자 또는 공백 이외의 것이 포함되어 있거나 비어 있으면 실패합니다.

decimal

아니요

필드에 소수 이외의 것이 포함되어 있으면 실패합니다. 숫자에 + 또는 - 부호도 허용합니다.

differs

필드가 매개변수의 필드와 다르지 않으면 실패합니다.

differs[field_name]

exact_length

필드 길이가 매개변수 값과 정확히 같지 않으면 실패합니다. 쉼표로 구분된 하나 이상의 값을 사용할 수 있습니다.

exact_length[5] 또는 exact_length[5,8,12]

field_exists

필드가 존재하지 않으면 실패합니다. (이 규칙은 v4.5.0에서 추가되었습니다.)

greater_than

필드가 매개변수 값보다 작거나 같거나 숫자가 아니면 실패합니다.

greater_than[8]

greater_than_equal_to

필드가 매개변수 값보다 작거나 숫자가 아니면 실패합니다.

greater_than_equal_to[5]

hex

아니요

필드에 16진수 문자 이외의 것이 포함되어 있으면 실패합니다.

if_exist

아니요

이 규칙이 있으면 검사할 데이터에 필드 키가 존재할 때만 유효성 검사가 필드를 확인합니다.

in_list

필드가 미리 정해진 목록에 없으면 실패합니다.

in_list[red,blue,green]

integer

아니요

필드에 정수 이외의 것이 포함되어 있으면 실패합니다.

is_natural

아니요

필드에 자연수(0, 1, 2, 3 등) 이외의 것이 포함되어 있으면 실패합니다.

is_natural_no_zero

아니요

필드에 0을 제외한 자연수(1, 2, 3 등) 이외의 것이 포함되어 있으면 실패합니다.

is_not_unique

데이터베이스에서 주어진 값이 존재하는지 확인합니다. 필터링을 위해 필드/값으로 레코드를 무시할 수 있습니다 (현재 하나의 필터만 허용). (v4.6.0부터 선택적으로 dbGroup을 매개변수로 전달할 수 있습니다)

is_not_unique[table.field,where_field,where_value] 또는 is_not_unique[dbGroup.table.field,where_field,where_value]

is_unique

이 필드 값이 데이터베이스에 존재하는지 확인합니다. 레코드 업데이트 시 자신을 무시하는 데 유용하도록 무시할 열과 값을 선택적으로 설정할 수 있습니다. (v4.6.0부터 선택적으로 dbGroup을 매개변수로 전달할 수 있습니다)

is_unique[table.field,ignore_field,ignore_value] 또는 is_unique[dbGroup.table.field,ignore_field,ignore_value]

less_than

필드가 매개변수 값보다 크거나 같거나 숫자가 아니면 실패합니다.

less_than[8]

less_than_equal_to

필드가 매개변수 값보다 크거나 숫자가 아니면 실패합니다.

less_than_equal_to[8]

matches

값이 매개변수의 필드 값과 일치해야 합니다.

matches[field]

max_length

필드가 매개변수 값보다 길면 실패합니다.

max_length[8]

min_length

필드가 매개변수 값보다 짧으면 실패합니다.

min_length[3]

not_in_list

필드가 미리 정해진 목록 안에 있으면 실패합니다.

not_in_list[red,blue,green]

numeric

아니요

필드에 숫자 문자 이외의 것이 포함되어 있으면 실패합니다.

permit_empty

아니요

필드가 빈 배열, 빈 문자열, null 또는 false를 받도록 허용합니다. 성공 시 required_with와 required_without을 제외한 다른 모든 유효성 검사 규칙을 건너뜁니다.

regex_match

필드가 정규 표현식과 일치하지 않으면 실패합니다. 참고: v4.7.0부터 이 규칙에 플레이스홀더를 사용하는 경우 단일 중괄호 {...} 대신 이중 중괄호 {{...}}를 사용해야 합니다.

regex_match[/regex/]

required

아니요

필드가 빈 배열, 빈 문자열, null 또는 false이면 실패합니다.

required_with

데이터에서 다른 필드 중 하나라도 empty()가 아닌 경우 이 필드는 필수입니다.

required_with[field1,field2]

required_without

데이터에서 다른 필드 중 하나라도 empty()인 경우 이 필드는 필수입니다.

required_without[field1,field2]

string

아니요

요소가 문자열임을 확인하는 alpha* 규칙의 일반적인 대안입니다.

timezone

아니요

timezone_identifiers_list()에 따른 시간대와 일치하지 않으면 실패합니다.

valid_base64

아니요

필드에 유효한 Base64 문자 이외의 것이 포함되어 있으면 실패합니다.

valid_cc_number

신용카드 번호가 지정된 제공업체가 사용하는 형식과 일치하는지 확인합니다. 현재 지원되는 제공업체: American Express (amex), China Unionpay (unionpay), Diners Club CarteBlance (carteblanche), Diners Club (dinersclub), Discover Card (discover), Interpayment (interpayment), JCB (jcb), Maestro (maestro), Dankort (dankort), NSPK MIR (mir), Troy (troy), MasterCard (mastercard), Visa (visa), UATP (uatp), Verve (verve), CIBC Convenience Card (cibc), Royal Bank of Canada Client Card (rbc), TD Canada Trust Access Card (tdtrust), Scotiabank Scotia Card (scotia), BMO ABM Card (bmoabm), HSBC Canada Card (hsbc)

valid_cc_number[amex]

valid_date

필드에 유효한 날짜가 포함되어 있지 않으면 실패합니다. 날짜 형식과 일치하는 선택적 매개변수를 지정하지 않으면 strtotime()이 허용하는 모든 문자열이 유효합니다. 따라서 일반적으로 매개변수를 지정하는 것이 필요합니다.

valid_date[d/m/Y]

valid_email

아니요

필드에 유효한 이메일 주소가 포함되어 있지 않으면 실패합니다.

valid_emails

아니요

쉼표로 구분된 목록에서 제공된 값 중 하나라도 유효한 이메일이 아니면 실패합니다.

valid_ip

제공된 IP가 유효하지 않으면 실패합니다. IP 형식을 지정하기 위해 ipv4 또는 ipv6의 선택적 매개변수를 받습니다.

valid_ip[ipv6]

valid_json

아니요

필드에 유효한 JSON 문자열이 포함되어 있지 않으면 실패합니다.

valid_url

아니요

필드에 URL이 (느슨하게) 포함되어 있지 않으면 실패합니다. “codeigniter”와 같이 호스트명이 될 수 있는 단순 문자열도 포함됩니다. 일반적으로 valid_url_strict를 사용해야 합니다.

valid_url_strict

필드에 유효한 URL이 포함되어 있지 않으면 실패합니다. 유효한 스키마 목록을 선택적으로 지정할 수 있습니다. 지정하지 않으면 http,https가 유효합니다. 이 규칙은 PHP의 FILTER_VALIDATE_URL을 사용합니다.

valid_url_strict[https]

참고

불리언을 반환하고 검사할 필드 데이터인 하나 이상의 매개변수를 허용하는 모든 네이티브 PHP 함수를 사용할 수도 있습니다.

중요

Validation 라이브러리는 검사할 데이터를 절대 변경하지 않습니다.

파일 업로드 규칙

업로드된 파일의 유효성을 검사할 때는 파일 유효성 검사를 위해 특별히 만들어진 규칙을 사용해야 합니다.

중요

파일 유효성 검사에는 아래 표에 나열된 규칙만 사용할 수 있습니다. 따라서 permit_empty와 같은 일반 규칙을 파일 유효성 검사 규칙 배열이나 문자열에 추가하면 파일 유효성 검사가 올바르게 작동하지 않습니다.

파일 업로드 HTML 필드의 값은 존재하지 않고 $_FILES 전역 변수에 저장되므로, 입력 필드 이름을 두 번 사용해야 합니다. 한 번은 다른 규칙과 마찬가지로 필드 이름을 지정하고, 다시 파일 업로드 관련 모든 규칙의 첫 번째 매개변수로 사용합니다:

// In the HTML
<input type="file" name="avatar">

// In the controller
$this->validateData([], [
    'avatar' => 'uploaded[avatar]|max_size[avatar,1024]',
]);

파일 업로드 폼 튜토리얼도 참조하십시오.

규칙

매개변수

설명

예시

uploaded

매개변수 이름이 업로드된 파일의 이름과 일치하지 않으면 실패합니다. 파일 업로드를 선택 사항(필수 아님)으로 하려면 이 규칙을 정의하지 마십시오.

uploaded[field_name]

max_size

업로드된 파일이 두 번째 매개변수(킬로바이트 단위)보다 크면 실패합니다. 또는 파일이 php.ini 설정 파일의 upload_max_filesize 지시문에 선언된 허용 최대 크기보다 큰 경우.

max_size[field_name,2048]

max_dims

업로드된 이미지의 최대 너비와 높이가 값을 초과하면 실패합니다. 첫 번째 매개변수는 필드 이름입니다. 두 번째는 너비이고 세 번째는 높이입니다. 파일이 이미지인지 확인할 수 없는 경우에도 실패합니다.

max_dims[field_name,300,150]

min_dims

업로드된 이미지의 최소 너비와 높이가 값을 충족하지 못하면 실패합니다. 첫 번째 매개변수는 필드 이름입니다. 두 번째는 너비이고 세 번째는 높이입니다. 파일이 이미지인지 확인할 수 없는 경우에도 실패합니다. (이 규칙은 v4.6.0에서 추가되었습니다.)

min_dims[field_name,300,150]

mime_in

파일의 mime 타입이 매개변수에 나열된 것 중 하나가 아니면 실패합니다.

mime_in[field_name,image/png,image/jpeg]

ext_in

파일의 확장자가 매개변수에 나열된 것 중 하나가 아니면 실패합니다.

ext_in[field_name,png,jpg,gif]

is_image

mime 타입을 기반으로 파일이 이미지인지 확인할 수 없으면 실패합니다.

is_image[field_name]

파일 유효성 검사 규칙은 단일 및 다중 파일 업로드 모두에 적용됩니다.