Advertisement
  1. Code
  2. CodeIgniter

Валидация формы в CodeIgniter: от начала до конца

Scroll to top
Read Time: 15 min

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

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

В этой статье мы рассмотрим встроенную библиотеку валидации формы в фреймворке CodeIgniter.

Вот основные моменты сегодняшней статьи:

  • Базовая валидация формы
  • Каскад и подготовка
  • Пользовательские сообщения об ошибках
  • Пользовательский колбэк для валидации
  • Конфигурация валидации

Пройдемся по основным правилам валидации

В этом разделе мы рассмотрим основные принципы валидации формы в CodeIgniter.

Для этого нам необходимо создать контроллер и файлы отображения. Файл контроллера загружает библиотеку валидации и запускает правила проверки относительно представленных данных формы. Файл представления содержит XHTML-код формы, и мы сохраним его для наших нужд.

Давайте продолжим и создадим эти два файла.

Создайте файл application/controllers/Validation.php со следующим содержимым.

1
<?php
2
// application/controllers/Validation.php

3
defined('BASEPATH') OR exit('No direct script access allowed');
4
5
class Validation extends CI_Controller {
6
    public function __construct() 
7
    {
8
      parent::__construct();
9
    
10
    	// load form and url helpers

11
    	$this->load->helper(array('form', 'url'));
12
    	
13
    	// load form_validation library

14
    	$this->load->library('form_validation');
15
    }
16
	
17
    public function basic()
18
    {
19
        // basic required field

20
        $this->form_validation->set_rules('text_field', 'Text Field One', 'required');
21
        
22
        // basic required field with minimum length

23
        $this->form_validation->set_rules('min_text_field', 'Text Field Two', 'required|min_length[8]');
24
        
25
        // basic required field with maximum length

26
        $this->form_validation->set_rules('max_text_field', 'Text Field Three', 'required|max_length[20]');
27
        
28
        // basic required field with exact length

29
        $this->form_validation->set_rules('exact_text_field', 'Text Field Four', 'required|exact_length[12]');
30
        
31
        // basic required field but alphabets only

32
        $this->form_validation->set_rules('alphabets_text_field', 'Text Field Five', 'required|alpha');
33
        
34
        // basic required field but alphanumeric only

35
        $this->form_validation->set_rules('alphanumeric_text_field', 'Text Field Six', 'required|alpha_numeric');
36
        
37
        // basic email field with email validation

38
        $this->form_validation->set_rules('valid_email_field', 'Email Field', 'required|valid_email');
39
        
40
        // password field with confirmation field matching

41
        $this->form_validation->set_rules('password_field', 'Password One', 'required');
42
        $this->form_validation->set_rules('password_confirmation_field', 'Password Confirmation Field', 'required|matches[password_field]');
43
        
44
        // basic required field with IPv4 validation

45
        $this->form_validation->set_rules('valid_ip_field', 'Valid IP Field', 'required|valid_ip[ipv4]');
46
        
47
        if ($this->form_validation->run() == FALSE)
48
        {
49
        	$this->load->view('validate_form');
50
        }
51
        else
52
        {
53
        	// load success template...

54
        	echo "It's all Good!";
55
        }
56
    }
57
	
58
    public function cascade()
59
    {
60
        // basic required field with cascaded rules

61
        $this->form_validation->set_rules('text_field', 'Text Field One', 'required|alpha|min_length[8]|max_length[20]');
62
         
63
        if ($this->form_validation->run() == FALSE)
64
        {
65
        	$this->load->view('validate_form');
66
        }
67
        else
68
        {
69
        	// load success template...

70
        	echo "It's all Good!";
71
        }
72
    }
73
	
74
    public function prep()
75
    {
76
        // basic required field with trim prepping applied

77
        $this->form_validation->set_rules('min_text_field', 'Text Field Two', 'trim|required|min_length[8]');
78
        
79
        if ($this->form_validation->run() == FALSE)
80
        {
81
        	$this->load->view('validate_form');
82
        }
83
        else
84
        {
85
        	// load success template...

86
        	echo "It's all Good!";
87
        }
88
    }
89
	
90
    public function custom_message()
91
    {
92
        // basic required field with trim prepping applied

93
        $this->form_validation->set_rules('alphabets_text_field', 'Text Field Five', 'required|alpha',
94
        	array('required'=>'Please enter Text Field Five!','alpha'=>'Only alphabets please!'));
95
        
96
        if ($this->form_validation->run() == FALSE)
97
        {
98
        	$this->load->view('validate_form');
99
        }
100
        else
101
        {
102
        	// load success template...

103
        	echo "It's all Good!";
104
        }
105
    }
106
	
107
    public function custom_rule()
108
    {
109
        // basic required field with trim prepping applied

110
        $this->form_validation->set_rules('text_field', 'Text Field Five', 'callback_custom_validation');
111
        
112
        if ($this->form_validation->run() == FALSE)
113
        {
114
        	$this->load->view('validate_form');
115
        }
116
        else
117
        {
118
        	// load success template...

119
        	echo "It's all Good!";
120
        }
121
    }
122
    
123
    public function custom_validation($field_value) 
124
    {
125
        if ($field_value == '' || $field_value == 'demo')
126
        {
127
        	$this->form_validation->set_message('custom_validation', "Come on, don't act like spammer!");
128
        	return FALSE;
129
        }
130
        else
131
        {
132
        	return TRUE;
133
        }
134
    }
135
    
136
    public function configuration()
137
    {
138
        // if you pass group id, only elements in that group will be validated

139
        // $this->form_validation->run('group_one')

140
        if ($this->form_validation->run() == FALSE)
141
        {
142
        	$this->load->view('validate_form');
143
        }
144
        else
145
        {
146
        	// load success template...

147
        	echo "It's all Good!";
148
        }
149
    }
150
}

Затем создайте файл отображения application/views/validate_form.php, как показано ниже.

1
<html>
2
    <head>
3
	<title>Form Validation Example</title>
4
	<style>
5
	.field_title{font-size: 13px;font-family:Arial;width: 300px;margin-top: 10px}
6
	.form_error{font-size: 13px;font-family:Arial;color:red;font-style:italic}
7
	</style>
8
	</head>
9
	
10
	<body>
11
		<div class="form_error">
12
		  <?php echo validation_errors(); ?>
13
		</div>
14
		
15
		<?php echo form_open(); ?>
16
		
17
			<h2>Form Validation Example</h2>
18
		
19
			<div>
20
				<div class="field_title">Text Field One (Required)</div>
21
				<input type="text" name="text_field" value="<?php echo set_value('text_field'); ?>" size="30" />
22
			</div>
23
			
24
			<div>
25
				<div class="field_title">Text Field Two (Minimum length)</div>
26
				<input type="text" name="min_text_field" value="<?php echo set_value('min_text_field'); ?>" size="30" />
27
			</div>
28
			
29
			<div>
30
				<div class="field_title">Text Field Three (Maximum length)</div>
31
				<input type="text" name="max_text_field" value="<?php echo set_value('max_text_field'); ?>" size="30" />
32
			</div>
33
			
34
			<div>
35
				<div class="field_title">Text Field Four (Exact length)</div>
36
				<input type="text" name="exact_text_field" value="<?php echo set_value('exact_text_field'); ?>" size="30" />
37
			</div>
38
			
39
			<div>
40
				<div class="field_title">Text Field Five (Alphabets only)</div>
41
				<input type="text" name="alphabets_text_field" value="<?php echo set_value('alphabets_text_field'); ?>" size="30" />
42
			</div>
43
			
44
			<div>
45
				<div class="field_title">Text Field Six (Alphanumeric only)</div>
46
				<input type="text" name="alphanumeric_text_field" value="<?php echo set_value('alphanumeric_text_field'); ?>" size="30" />
47
			</div>
48
			
49
			<div>
50
				<div class="field_title">Email Field</div>
51
				<input type="text" name="valid_email_field" value="<?php echo set_value('valid_email_field'); ?>" size="30" />
52
			</div>
53
			
54
			<div>
55
				<div class="field_title">Password Field</div>
56
				<input type="password" name="password_field" value="" size="30" />
57
			</div>
58
			
59
			<div>
60
				<div class="field_title">Password Confirmation Field</div>
61
				<input type="password" name="password_confirmation_field" value="" size="30" />
62
			</div>
63
			
64
			<div>
65
				<div class="field_title">IP Field</div>
66
				<input type="text" name="valid_ip_field" value="<?php echo set_value('valid_ip_field'); ?>" size="30" />
67
			</div>
68
			
69
			<div class="field_title">
70
				<input type="submit" value="Submit" />
71
			</div>
72
		
73
		</form>
74
	</body>
75
</html>

С помощью этой настройки вы должны увидеть форму при открытии http://your-codeigniter-site/validation/basic в своем браузере. Попробуйте отправить форму без заполнения каких-либо полей, и вы увидите список сообщений об ошибках! Не беспокойтесь, если вы не понимаете, как это работает, поскольку мы подробно рассмотрим каждый фрагмент кода.

История начинается с метода __construct.

1
public function __construct() 
2
{
3
    parent::__construct();
4
    
5
    // load form and url helpers

6
    $this->load->helper(array('form', 'url'));
7
      
8
    // load form_validation library

9
    $this->load->library('form_validation');
10
}

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

Затем мы загружаем библиотеку валидации формы, чтобы она позволяла нам связывать правила проверки формы с элементами формы, как мы увидим в следующем разделе.

Давайте рассмотрим код метода basic. Что делает этот метод? Если вы вызовете его с помощью метода GET, он отобразит форму и, если он был вызван с использованием метода POST, он применяет правила проверки представленных данных и отображает сообщения об ошибках, если они есть, вместе с формой.

1
public function basic()
2
{
3
	// basic required field

4
	$this->form_validation->set_rules('text_field', 'Text Field One', 'required');
5
	
6
	// basic required field with minimum length

7
	$this->form_validation->set_rules('min_text_field', 'Text Field Two', 'required|min_length[8]');
8
	
9
	// basic required field with maximum length

10
	$this->form_validation->set_rules('max_text_field', 'Text Field Three', 'required|max_length[20]');
11
	
12
	// basic required field with exact length

13
	$this->form_validation->set_rules('exact_text_field', 'Text Field Four', 'required|exact_length[12]');
14
	
15
	// basic required field but alphabets only

16
	$this->form_validation->set_rules('alphabets_text_field', 'Text Field Five', 'required|alpha');
17
	
18
	// basic required field but alphanumeric only

19
	$this->form_validation->set_rules('alphanumeric_text_field', 'Text Field Six', 'required|alpha_numeric');
20
	
21
	// basic email field with email validation

22
	$this->form_validation->set_rules('valid_email_field', 'Email Field', 'required|valid_email');
23
	
24
	// password field with confirmation field matching

25
	$this->form_validation->set_rules('password_field', 'Password One', 'required');
26
	$this->form_validation->set_rules('password_confirmation_field', 'Password Confirmation Field', 'required|matches[password_field]');
27
	
28
	// basic required field with IPv4 validation

29
	$this->form_validation->set_rules('valid_ip_field', 'Valid IP Field', 'required|valid_ip[ipv4]');
30
	
31
	if ($this->form_validation->run() == FALSE)
32
	{
33
		$this->load->view('validate_form');
34
	}
35
	else
36
	{
37
		// load success template...

38
		echo "It's all Good!";
39
	}
40
}

Поскольку мы уже загрузили библиотеку валидации формы в конструкторе, вы можете получить к ней доступ, используя соглашение $this->form_validation.

Метод set_rules используется для привязки правила проверки к полю формы. Как правило, это три аргумента:

  • Первый аргумент - это имя поля формы.
  • Второй аргумент - это метка, которая используется для ссылки на поле формы при отображении сообщения об ошибке для этого поля.
  • Третий аргумент - это правило, которое вы хотите применить к полю формы. Библиотека валидации формы содержит множество встроенных правил, которые вы могли бы использовать.

Давайте рассмотрим некоторые из этих правил, поскольку уже мы использовали их в основном методе.

Одним из наиболее часто используемых правил является правило required, которое делает поле формы обязательным.

1
// basic required field

2
$this->form_validation->set_rules('text_field', 'Text Field One', 'required');

Затем, если вы хотите создать поле формы определенной длины, вы можете использовать правила min_length и max_length.

1
// basic required field with minimum length

2
$this->form_validation->set_rules('min_text_field', 'Text Field Two', 'required|min_length[8]');
3
      
4
// basic required field with maximum length

5
$this->form_validation->set_rules('max_text_field', 'Text Field Three', 'required|max_length[20]');

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

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

С другой стороны, если вы хотите создать поле формы с точной длиной, вы можете использовать правило exact_length.

1
// basic required field with exact length

2
$this->form_validation->set_rules('exact_text_field', 'Text Field Four', 'required|exact_length[12]');

Что делать, если вы хотите проверить поле формы только на алфавит или буквенно-цифровые символы?

1
// basic required field but alphabets only

2
$this->form_validation->set_rules('alphabets_text_field', 'Text Field Five', 'required|alpha');
3
      
4
// basic required field but alphanumeric only

5
$this->form_validation->set_rules('alphanumeric_text_field', 'Text Field Six', 'required|alpha_numeric');

Следующим кандидатом является проверка подлинности электронной почты.

1
// basic email field with email validation

2
$this->form_validation->set_rules('valid_email_field', 'Email Field', 'required|valid_email');

Затем правило matches позволяет сравнить значение поля формы с значением другого поля этой формы. Лучшим примером этого является поле пароля, которое должно совпадать с полем подтверждения пароля при отправке формы.

1
// password field with confirmation field matching rule

2
$this->form_validation->set_rules('password_field', 'Password One', 'required');
3
$this->form_validation->set_rules('password_confirmation_field', 'Password Confirmation Field', 'required|matches[password_field]');

Последний пример нашего базового метода - это проверка IP-адреса.

Правило valid_ip проверяет IP-адрес на первый переданный аргумент. В следующем примере мы только ищем IP-адреса ipv4!

1
// basic required field with IPv4 validation

2
$this->form_validation->set_rules('valid_ip_field', 'Valid IP Field', 'required|valid_ip[ipv4]');

Это то что это касается базовой валидации в CodeIgniter.

Как работает каскадирование и предварительная подготовка

В этом разделе мы рассмотрим каскадирование и предварительную подготовку, которые позволят вам объединить несколько правил проверки в один проход.

Фактически, я бы сказал, что мы полностью использовали каскадирование в наших предыдущих примерах. Вспомните, про оператор tube, который использовался для объединения нескольких правил - и да, так называемых каскадных правил валидации.

Возьмите код метода cascade.

1
public function cascade()
2
{
3
	// basic required field with cascaded rules

4
	$this->form_validation->set_rules('text_field', 'Text Field One', 'required|alpha|min_length[8]|max_length[20]');
5
	 
6
	if ($this->form_validation->run() == FALSE)
7
	{
8
		$this->load->view('validate_form');
9
	}
10
	else
11
	{
12
		// load success template...

13
		echo "It's all Good!";
14
	}
15
}

Как показано в примере выше, мы применили четыре правила валидации, разделенные символом оператора | к текстовому полю text_field. Поэтому в этом случае необходимо пройти каждое правило для проверки правильности формы!

Попробуйте и посмотрите, как это работает!

Затем есть предварительная подготовка, которая позволяет вам применять определенные операции над данными, которые отправляются. Чаще всего вы хотите удалить ведущие и конечные пробелы в представленных пользователем данных. Вероятно, первое, что приходит вам на ум в этом случае, - это использовать функцию trim, и хорошая новость заключается в том, что вы можете ее использовать!

Это именно то, что делает наш метод prep.

1
public function prep()
2
{
3
	// basic required field with trim prepping applied

4
	$this->form_validation->set_rules('min_text_field', 'Text Field Two', 'trim|required|min_length[8]');
5
6
	if ($this->form_validation->run() == FALSE)
7
	{
8
		$this->load->view('validate_form');
9
	}
10
	else
11
	{
12
		// load success template...

13
		echo "It's all Good!";
14
	}
15
}

Как вы можете видеть, мы использовали слово trim в дополнение к правилам проверки. Таким образом, данные сначала обрезаются, а затем будут проходить другие правила валидации. Фактически, вы можете использовать любую функцию PHP, которая принимает один аргумент в соответствии с документацией CodeIgniter.

Попробуйте запустить наш пример, добавив несколько конечных пробелов и посмотрите, как это работает.

Настройка сообщений об ошибках

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

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

1
public function custom_message()
2
{
3
    // field with custom error message

4
	$this->form_validation->set_rules('alphabets_text_field', 'Text Field Five', 'required|alpha',
5
	  array('required'=>'Please enter Text Field Five!','alpha'=>'Only alphabets please!'));
6
7
	if ($this->form_validation->run() == FALSE)
8
	{
9
		$this->load->view('validate_form');
10
	}
11
	else
12
	{
13
		// load success template...

14
		echo "It's all Good!";
15
	}
16
}

Обратите внимание на четвертый аргумент, предоставленный методу set_rules. Он содержит массив настраиваемых сообщений проверки для каждого правила проверки, а ключ каждого элемента массива - это правило валидации.

1
array(
2
    'required'=>'Please enter Text Field Five!',
3
    'alpha'=>'Only alphabets please!'
4
)

Попробуйте, и вы должны увидеть наши сообщения об ошибках! Довольно круто, не так ли?

Пользовательские колбэки валидации

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

Чтобы продемонстрировать это, мы создадим специальный обратный вызов валидации, а позже мы увидим, как его использовать вместе с методом set_rules.

Для начала давайте быстро рассмотрим метод custom_rule.

1
public function custom_rule()
2
{
3
    // field with custom validation callback passed

4
	$this->form_validation->set_rules('text_field', 'Text Field Five', 'callback_custom_validation');
5
6
	if ($this->form_validation->run() == FALSE)
7
	{
8
		$this->load->view('validate_form');
9
	}
10
	else
11
	{
12
		// load success template...

13
		echo "It's all Good!";
14
	}
15
}

Это ничем не отличается от обычного вызова метода set_rules, за исключением того, что мы предоставили custom_validation, а не какое-либо правило. Важно отметить, что вам нужно использовать префикс пользовательского запроса проверки валидации с помощью callback_, когда вы передаете его в качестве аргумента.

Затем давайте внедрим обратный вызов для проверки валидации.

1
public function custom_validation($field_value) 
2
{
3
	if ($field_value == '' || $field_value == 'demo')
4
	{
5
		$this->form_validation->set_message('custom_validation', "Come on, don't act like spammer!");
6
		return FALSE;
7
	}
8
	else
9
	{
10
		return TRUE;
11
	}
12
}

Когда вызывается обратный вызов, значение, введенное пользователем, будет передано в качестве первого аргумента. Таким образом, переменная $field_value содержит значение, введенное пользователем, для которого вы можете реализовать свою собственную логику валидации.

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

И это была история пользовательских колбэков для валидации.

И последнее, но не менее важное: это конфигурация валидации, которая заслуживает некоторого внимания, когда мы продвигаемся к завершению этой статьи.

Конфигурация валидации

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

Например, database.php позволяет вам определять параметры, связанные с базой данных, в то время как autoload.php позволяет вам определять компоненты, которые должны быть автоматически загружены во время начальной загрузки приложения.

Точно так же вы можете создать файл form_validation.php в каталоге config и использовать этот файл для определения правил проверки на уровне приложения, которые можно использовать глобально. Если это звучит вам чуждо, нет лучшего способа понять это, чем на самом деле смотреть на практический пример.

Создайте файл application/config/form_validation.php со следующим содержимым.

1
<?php
2
$config = array(
3
    array(
4
        'field' => 'text_field',
5
        'label' => 'Text Field One',
6
        'rules' => 'required'
7
    ),
8
    array(
9
        'field' => 'min_text_field',
10
        'label' => 'Text Field Two',
11
        'rules' => 'required|min_length[8]'
12
    ),
13
    array(
14
        'field' => 'max_text_field',
15
        'label' => 'Text Field Three',
16
        'rules' => 'required|max_length[20]'
17
    )
18
);

Теперь давайте быстро посмотрим, как выглядит наш метод configuration.

1
public function configuration()
2
{
3
    // if you pass group id, only elements in that group will be validated

4
    // $this->form_validation->run('group_one')

5
    if ($this->form_validation->run() == FALSE)
6
    {
7
    	$this->load->view('validate_form');
8
    }
9
    else
10
    {
11
    	// load success template...

12
    	echo "It's all Good!";
13
    }
14
}

Попробуйте запустить http://your-codeigniter-site/validation/configuration и отправьте пустую форму. Вы увидите сообщения об ошибках для трех полей формы! Но подождите, откуда они берутся, поскольку мы не установили какие-либо правила проверки в нашем методе configuration?

Внимательные читатели уже заметили, что они автоматически извлекаются из файла конфигурации валидации, определенного в application/config/form_validation.php. Разве это не удивительно? Это позволяет централизовать правила в одном месте и уменьшает дублирование кода в методах действий.

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

Замените код в application/config/form_validation.php следующим.

1
<?php
2
$config = array(
3
    'group_one' => array(
4
        array(
5
            'field' => 'text_field',
6
            'label' => 'Text Field One',
7
            'rules' => 'required'
8
        )
9
    ),
10
    'group_two' => array(
11
        array(
12
            'field' => 'min_text_field',
13
            'label' => 'Text Field Two',
14
            'rules' => 'required|min_length[8]'
15
        ),
16
        array(
17
            'field' => 'max_text_field',
18
            'label' => 'Text Field Three',
19
            'rules' => 'required|max_length[20]'
20
        )
21
    )
22
);

В вашем методе configuration найдите следующую строку:

1
if ($this->form_validation->run() == FALSE)

И замените его на:

1
if ($this->form_validation->run('group_one') == FALSE)

Теперь попробуйте отправить пустую форму, и вы увидите ошибку только для Text Field One. Это потому, что мы передали group_one как идентификатор группы, поэтому будут провалидированы только элементы из этой группы.

Наконец, давайте посмотрим на тип конфигурации, который позволяет вам определять правила на основе URL.

Замените код в application/config/form_validation.php следующим.

1
$config = array(
2
    'validation/configuration' => array(
3
        array(
4
            'field' => 'max_text_field',
5
            'label' => 'Text Field Three',
6
            'rules' => 'required|max_length[20]'
7
        )
8
    )
9
);

В этом типе конфигурации вам нужно использовать комбинацию имени контроллера и имени метода, разделенного символом /. Таким образом, вы можете сразу определить правила для нескольких методов действий.

Теперь вы должны увидеть сообщение об ошибке для Text Field Three, если вы попытаетесь отправить пустую форму по адресу http://your-codeigniter-site/validation/configuration.

И на этом история настройки валидации заканчивается!

Заключение

В этой статье мы подробно обсудили валидацию формы в CodeIgniter.

Мы начали наше путешествие с основных правил валидации, а затем перешли к более продвинутым темам, таким как каскадирование, предварительная подготовка и конфигурация валидации.

Надеюсь, вам понравилась эта статья, и вы можете поделиться своими ценными идеями в обратной связи ниже.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.