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 Validator và Filter,
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ó:
FilterChain
lấy ra bằng hàmgetFilterChain()
: nó chứa các chứa cácFillter
, được gắn vào bằng hàm attachByName($filter), attach($filter).ValidatorChain
lấy ra bằng hàmgetValidatorChain()
: nó chứa cácValidator
đượ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 traisValid()
: xem dữ liệu $value có phù hợpgetMessages()
: lấy mảng chứa thông báo nếu dữ liệu không phù hợpgetValue()
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);