zend-inputfilter là một thư viện giúp cho việc lọc kết hợp xác thực dữ liệu, nó là thử viện xây dựng trên cơ sở kết hợp làm việc chung giữa ValidatorFilter,

Nếu ứng dụng chưa tích hợp inputfilter thì chạy lệnh composer sau đề tích hợp vào

composer require zendframework/zend-inputfilter

Input

Zend\InputFilter\Input , nó làm hai nhiệm vụ là lọc và xác thực (Filter và Validator) dữ liệu, một đối tượng Input có chứa các Validator gọi là ValidatorChain và các Filter gọi là FilterChain.

Khởi tạo một Input bằng đoạn code sau:

$input = new \Zend\InputFilter\Input('namevar');

namevar: key của biến cần kiểm tra (ví dụ email, id ...).

Mỗi đối tượng Input đều có:

  1. FilterChain lấy ra bằng hàm getFilterChain(): nó chứa các chứa các Fillter, được gắn vào bằng hàm attachByName($filter), attach($filter).
  2. ValidatorChain lấy ra bằng hàm getValidatorChain(): nó chứa các Validator được gắn vào nó bằng attachByName($filter), attach($filter)

Sau khi khởi tạo xong, thì tiến hành gắn các Filter và Validator vào nó bằng cách trên

Nếu muốn sử dụng (không đưa vào Inputfilter) thì cần lọc và xác thực dữ liệu bằng Input dùng cách sau:

  • setValue($value) : thiết lập giá trị cần lọc, kiểm tra
  • isValid(): xem dữ liệu $value có phù hợp
  • getMessages(): lấy mảng chứa thông báo nếu dữ liệu không phù hợp
  • getValue() lấy dữ liệu sau khi qua bộ lọc trong input

Ví dụ tạo ra một Input sẽ dùng kiểm tra cho name: password của FORM với điều kiện cắt bỏ khoảng trắng đầu đuôi, và phải dài tối thiểu 8 ký tự.

//Khởi tạo một input có tên password
$password = new \Zend\InputFilter\Input('password');

//Gắn các Filter vào
$password->getFilterChain()
         ->attach(new \Zend\Filter\StringTrim());

//Gắn các Valitor vào
$password->getValidatorChain()
         ->attach(new \Zend\Validator\StringLength(8));

//Thiết lập dữ liệu, lọc và xác thực
$password->setValue('  3@#@');
var_dump($password->isValid());
var_dump($password->getMessages());
var_dump($password->getValue());

InputFilter

Zend\InputFilter\InputFilter đơn giản nó chứa nhiều Input ở trên, được sử dụng để Filter và Validator mảng dữ liệu gửi đến. Mỗi mảng dữ liệu là mảng dạng array('key'=>$value)

InputFilter sẽ tìm Input có tên là key và dùng Input đó để Filter và Validate $value.

Để chuyển dữ liệu cho InputFilter bạn sử dụng hàm setData(), dư liệu ở dạng bảng thông thường nó đến từ FORM thông qua POST.

Ví dụ:

use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Input;
use Zend\Validator;

//Tạo các Input
$email = new Input('email');
$email->getValidatorChain()
      ->attach(new Validator\EmailAddress());

$password = new Input('password');
$password->getValidatorChain()
         ->attach(new Validator\StringLength(8));

$inputFilter = new InputFilter();

//Gắn các Input vào Inputfiler
$inputFilter->add($email);
$inputFilter->add($password);

//Thiết lập kiểm tra mảng dữ liệu $_POST,
//Nó sẽ lấy các key và dữ liệu có tên: email, password để
//lọc và kiểm tra theo tên input tương ứng

$inputFilter->setData($_POST);

if ($inputFilter->isValid()) {
    echo "Dữ liệu POST phù hợp\n";
} else {
    echo "Dữ liệu POST khong phù hợp do\n";
    foreach ($inputFilter->getInvalidInput() as $error) {
        print_r($error->getMessages());
    }
}

Trong phương thức add() của InputFilter bạn cũng có thể sử dụng dữ liệu mảng để diễn tác các Input thêm vào, chức năng factory sẽ nhận biết và tự khởi tạo và thêm vào các Input phù hợp

Cú pháp cơ bản thêm một Input

$inputFilter->add(
    [
       'name' => 'nameInput', //email, password, user ...
        
        'filters' => [ //Các filter trong Input
            [
                 'name' => 'NameFilter', //Tên filter như StringTrim ...
                 'options' => [
                         //... các thiết lập cho filter này
                 ]
            ],
            //...Các filter khác
        ],
        
        'validators' => [ //Các validator trong Input
            [
                'name' => 'NameValidator', //Tên validator như StringLength ...
                'options' => [
                    //... các thiết lập cho validator này
                ]
            ],
            //...Các validator khác
        ], 
    //../
    ]
);

Ví dụ: (đây là cách hay dùng với FORM)

use Zend\InputFilter\InputFilter;

$filter = new InputFilter();

// Adding a single input
$filter->add([
    'name' => 'username',
    'required' => true,
    'validators' => [
        [
            'name' => 'not_empty',
        ],
        [
            'name' => 'string_length',
            'options' => [
                'min' => 5
            ],
        ],
    ],
]);

// Adding another input filter what also contains a single input. Merging both.
$filter->add([
    'type' => 'Zend\InputFilter\InputFilter',
    'password' => [
        'name' => 'password',
        'required' => true,
        'validators' => [
            [
                'name' => 'not_empty',
            ],
            [
                'name' => 'string_length',
                'options' => [
                    'min' => 8
                ],
            ],
        ],
    ],
]);

//Đưa InputFilter vào form, để lọc và xác thực dữ liệu
//theo tên phần từ FORM
$form->setInputFilter($inputFilter);

Đăng ký nhận bài viết mới