FuelPHP: Một số kiến thức cơ bản về Validation

Validation Class

The validation class giúp bạn validate đầu vào.

Usage

  • Để bắt đầu validation bạn cần phải tạo ra một object, đây có thể là object mặc định có tên "default" hoặc bạn có thể đặt tên nó nếu bạn cần nhiều object xác nhận.
// Use default
$val = Validation::forge();

// ... or name it
$val = Validation::forge('my_validation');
  • Sau khi khởi tạo bạn có thể bắt đầu thêm các field để validate. Điều này hoạt động chính xác như khi sử dụng lớp Fieldset, tuy nhiên ở đây chúng ta sẽ chỉ ghi lại cách sử dụng ưa thích.
$val = Validation::forge('my_validation');
// Add a field for username, give it the label "Your username" and make it required
$val->add('username', 'Your username')->add_rule('required');

// Now add another field for password, and require it to contain at least 3 and at most 10 characters
$val->add('password', 'Your password')->add_rule('required')
    ->add_rule('min_length', 3)
    ->add_rule('max_length', 10);

// Now add another field for gender, and require it to contain either "M" or "F".
$val->add('gender', 'Your gender')->add_rule('required')
    ->add_rule('match_collection', array('M', 'F'));
  • Tham số đầu tiên của phương thức add_rule () có thể chứa các tên PHP native function, bất kỳ lệnh PHP callback hợp lệ và Closures nào trong việc thêm để cung cấp các phương thức validate. Phương thức sẽ nhận giá trị được vaildate là đối số đầu tiên của nó và bất kỳ đối số nào khác có thể được cung cấp cho phương thức add_rule ().
  • Chúng tôi cũng cung cấp một cú pháp ngắn hơn rất hạn chế so sánh.
// The same fields as the example above
$val = Validation::forge('my_validation');
$val->add_field('username', 'Your username', 'required');
$val->add_field('password', 'Your password', 'required|min_length[3]|max_length[10]');
$val->add_field('gender', 'Your gender', 'required|match_collection[M,F]');
  • Khi tất cả các trường đã được thêm, bạn có thể chạy vaildation của bạn. Điều này sẽ mặc định để $_POST đầu vào, nhưng có thể được mở rộng và ghi đè khi đưa ra một mảng đầu vào.
// run validation on just post
if ($val->run())
{
    // process your stuff when validation succeeds
}
else
{
    // validation failed
}

// alternative to above, overwriting the username in post, password will still be sought in post
if ($val->run(array('username' => 'something')))
  • Khi validation được chạy, có ba phương pháp có sẵn để có thông tin về đầu vào:
// get an array of successfully validated fields => value pairs
$vars = $val->validated();
// get an array of validation errors as field => error pairs
$errors = $val->error();
// get an array of the input that was validated, this merged the post & input given to run()
$input = $val->input();

// all these methods can also get just the value for a single field
$var = $val->validated('username');
  • Validation cũng có thể chạy một phần, trong trường hợp đó thậm chí các field bắt buộc sẽ bị bỏ qua khi chúng không ở POST hoặc đầu vào được đưa ra để run(). Thực thi điều này bằng cách thiết lập tham số thứ 2 của run thành true.
// this will only validate the password when username isn't present in post
$val->run(array('password' => 'whatever'), true);

Validation rules

  • Lưu ý rằng tất cả các phương pháp (thậm chí min_length) cũng sẽ return true khi input đầu vào trống. Để có thực hiện các validation khác một cách chính xác bạn nên thêm rule "required".
  • Tất cả các rule này có thể được sử dụng như dưới đây:
// example normal usage with rule without and one with params
$val->add('email', 'Email address')->add_rule('match_value', '[email protected]', true)->add_rule('valid_email');
$val->add_field('email', 'Email address', 'match_value[[email protected],1]|valid_email');

Rules table

  • Ở đây mình sẽ chỉ giới thiệu một số rule thường dùng nhất.

required () Rule này được thiết lập sẽ validate input value khác null, false hay một chuỗi trống. match_pattern ($pattern) Rule này được thiết lập để validate input value phù hợp với pattern. min_length ($length) Kiểm tra xem chuỗi hợp lệ khi chứa số ký tự nhỏ nhất là $length. max_length ($length) Kiểm tra xem chuỗi hợp lệ khi chứa số ký tự lớn nhất là $length. valid_date ($format, $strict = true) Kiểm tra input value hợp lệ với $format. valid_email () Kiểm tra input value là định dạng email hợp lệ. valid_url() Kiểm tra input value là định dạng url hợp lệ.

Valid string rule

  • Xác nhận xem một chuỗi tuân thủ các điều kiện được thiết lập bởi tham số $ flags. Các flag được chấp nhận là:

alpha Cho phép các ký tự chữ cái. uppercase Được sử dụng kết hợp với alpha và chỉ cho phép chữ hoa. lowercase Được sử dụng kết hợp với alpha và chỉ cho phép chữ thường. specials Cho phép các ký tự theo thứ tự chữ cái và ký tự đặc biệt. numeric Cho phép các ký tự số. spaces Cho phép spaces. newlines Cho phép ký tự dòng mới. utf8 Thêm UTF8 sửa đổi để regex.

Extending the Validation class

Có vài cách tiếp cận mở rộng Validation class:

  1. Mở rộng core class như mô tả trong Extending Core Classes
  2. Tạo môt class trong app/classes/myrules.php (ví dụ)
// app/classes/myrules.php
class MyRules
{
   // note this is a static method
   public static function _validation_unique($val, $options)
   {
       list($table, $field) = explode('.', $options);

       $result = DB::select(DB::expr("LOWER (\"$field\")"))
       ->where($field, '=', Str::lower($val))
       ->from($table)->execute();

       return ! ($result->count() > 0);
   }

   // note this is a non-static method
   public function _validation_is_upper($val)
   {
       return $val === strtoupper($val);
   }

}

// and call it like:
$val = Validation::forge();

// Note the difference between static and non-static validation rules:

// Add it staticly, will only be able to use static methods
$val->add_callable('MyRules');

// Adds it non-static, will be able to use both static and non-static methods
$val->add_callable(new MyRules());

$val->add('username', 'Your username', array(), array('trim', 'strip_tags', 'required', 'is_upper'))
   ->add_rule('unique', 'users.username');
  1. Gọi callbacks từ một model. Nó làm việc như phương thức được mô tả ở trên, nhưng chúng ta chỉ cần gọi nó theo cách khác:
$val = Validation::forge();
$val->add_model('Model_User'); 

Lưu ý: Bạn cần tiền tố _validation_cho một method validation.

  • Có thể hữu ích để sử dụng Validation :: active () và Validation :: active_field () để có được trường hợp validation hiện đang hoạt động và field hiện đang được xác nFuelPHPhận, tương ứng.
public static function _validation_unique($val, $options)
{
    Validation::active()->set_message('unique', 'The field :label must be unique, but :value has already been used');
...
}