Validation and Constraints - korobochkin/wp-kit GitHub Wiki

WP Kit предоставляет более 40 валидаторов для проверки данных. Валидация, генерация и обработка ошибок стандартизирована. Вы можете создавать свои валидаторы и изменять тексты ошибок, а также понимать, какая именно ошибка перед вами.


Валидация данных очень важна, потому что правильная проверка данных поможет избежать множества ошибок, сбоев и уязвимостей в работе вашего продукта. Ядро WordPress не предоставляет каких-либо инструментов для проверки. Все что есть для разработчиков это функция is_email().

Кроме того, в результате проверок очень часто нужно вывести ошибки выявленные при проверке или записать их в log файл.

Эта серия проблем действительно заставляет чувствовать дискомфорт, когда вы пишите код. И как правило в результате получается ужасный результат на десятки и сотни строчек кода, который плохо читается и работает не достаточно надежно. Потому что каждый раз писать сотни дотошных проверок бывает утомительно и скучно.

Текущая реальность

Например, вот код из WooCommerce. Можете ли вы это прочитать и убедиться что все работает правильно? Эта проверка даже не влезает на экран моего ноутбука. И кроме того надо помнить что делают и возвращают функции вроде wc_sanitize_taxonomy_name(), вызываемые прямо внутри if.

$taxonomy_exists    = taxonomy_exists( wc_attribute_taxonomy_name( $attribute['attribute_name'] ) );
$old_attribute_name = $wpdb->get_var( "SELECT attribute_name FROM {$wpdb->prefix}woocommerce_attribute_taxonomies WHERE attribute_id = $attribute_id" );
if ( $old_attribute_name != $attribute['attribute_name'] && wc_sanitize_taxonomy_name( $old_attribute_name ) != $attribute['attribute_name'] && $taxonomy_exists ) {
		return new WP_Error( 'error', sprintf( __( 'Slug "%s" is already in use. Change it, please.', 'woocommerce' ), sanitize_title( $attribute['attribute_name'] ) ) );
}

И основная проблема в том, что вы должны быть энциклопедией и помнить все на свете вместо того чтобы быть программистом и продумывать архитектуру.

Преимущества WP Kit

Для проверки данных WP Kit использует Symfony Validator component, который делает возможным любые типы проверок без головной боли. У этого подхода есть несколько преимуществ:

  1. Более 40 валидаторов уже доступны и написаны заранее.
  2. Тексты ошибок созданы заранее. Но вы можете задать свои собственные.
  3. Логика проверки и ошибки создаются в виде отдельных классов и их можно использовать где угодно.
  4. Можно создавать свои собственные правила для проверки.
  5. Другие приложения или часть вашего приложения могут понимать, какая именно ошибка возникла.

Как проверять данные

Вся серия компонентов DataComponents имеет несколько встроенных предустановленных методов, которые можно использовать для проверки данных.

Мы будем рассматривать примеры с использованием Options, но аналогичным образом можно использовать Transients, PostMetas, TermMetas.

// Create option instance.
$option = new YourOption();

// Validate and returns array with error instances.
$option->validate();

// Validate and returns true or false. Useful in if states.
$option->isValid();

// If case if you want validate some random data.
$option->validateValue($yourCustomVariable);

WARNING: validate() method can throws different exceptions by Validator Component. Usually this can happen if your data type is different than expected.

Как создавать проверки

Правила для проверки в WP Kit называются Constraints. Это отдельные объекты (PHP classes), которые позволяют задавать методы проверки данных, а также указать какие ошибки и их тексты будут сгенерированы, если данные не соответствуют желаемым.

Самый простой пример создания проверки на длину строчки — от 2 до 10 символов.

use Symfony\Component\Validator\Constraints;

new Constraints\Length(array(
  'min' => 2,
  'max' => 10,
));

Чтобы описать серию проверок для определенного компонента необходимо создать метод buildConstraint() внутри вашего DataComponent.

Это позволяет задать любые типы проверок, а также сообщения об ошибка могут отличаться для каждого конкретного компонента, даже если используется одинаковый валидатор.

use Symfony\Component\Validator\Constraints;
use Korobochkin\WPKit\Options\AbstractOption;

class MyAwesomeOption extends AbstractOption {

  // your option constructor

  public function buildConstraint() {
    return array(
      new Constraints\NotNull(),
      new Constraints\Length(array(
        'min' => 2,
        'max' => 10,
        'minMessage' => 'Your custom message for min error.',
        'maxMessage' => 'Your custom message for max error.',
      )),
    );
  }
}

Constraints

Полный список более 40 готовых constraints и документацию к ним вы можете найти на странице Validation Constraints Reference.

⚠️ **GitHub.com Fallback** ⚠️