forked from yiisoft/yii2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStringValidator.php
214 lines (194 loc) · 7.01 KB
/
StringValidator.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\validators;
use Yii;
/**
* StringValidator validates that the attribute value is of certain length.
*
* Note, this validator should only be used with string-typed attributes.
*
* @author Qiang Xue <[email protected]>
* @since 2.0
*/
class StringValidator extends Validator
{
/**
* @var int|array specifies the length limit of the value to be validated.
* This can be specified in one of the following forms:
*
* - an integer: the exact length that the value should be of;
* - an array of one element: the minimum length that the value should be of. For example, `[8]`.
* This will overwrite [[min]].
* - an array of two elements: the minimum and maximum lengths that the value should be of.
* For example, `[8, 128]`. This will overwrite both [[min]] and [[max]].
* @see tooShort for the customized message for a too short string.
* @see tooLong for the customized message for a too long string.
* @see notEqual for the customized message for a string that does not match desired length.
*/
public $length;
/**
* @var int maximum length. If not set, it means no maximum length limit.
* @see tooLong for the customized message for a too long string.
*/
public $max;
/**
* @var int minimum length. If not set, it means no minimum length limit.
* @see tooShort for the customized message for a too short string.
*/
public $min;
/**
* @var string user-defined error message used when the value is not a string.
*/
public $message;
/**
* @var string user-defined error message used when the length of the value is smaller than [[min]].
*/
public $tooShort;
/**
* @var string user-defined error message used when the length of the value is greater than [[max]].
*/
public $tooLong;
/**
* @var string user-defined error message used when the length of the value is not equal to [[length]].
*/
public $notEqual;
/**
* @var string the encoding of the string value to be validated (e.g. 'UTF-8').
* If this property is not set, [[\yii\base\Application::charset]] will be used.
*/
public $encoding;
/**
* @var boolean whether to require the value to be a string data type.
* If false any scalar value will be treated as it's string equivalent.
* @since 2.0.33
*/
public $strict = true;
/**
* {@inheritdoc}
*/
public function init()
{
parent::init();
if (is_array($this->length)) {
if (isset($this->length[0])) {
$this->min = $this->length[0];
}
if (isset($this->length[1])) {
$this->max = $this->length[1];
}
$this->length = null;
}
if ($this->encoding === null) {
$this->encoding = Yii::$app ? Yii::$app->charset : 'UTF-8';
}
if ($this->message === null) {
$this->message = Yii::t('yii', '{attribute} must be a string.');
}
if ($this->min !== null && $this->tooShort === null) {
$this->tooShort = Yii::t('yii', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.');
}
if ($this->max !== null && $this->tooLong === null) {
$this->tooLong = Yii::t('yii', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.');
}
if ($this->length !== null && $this->notEqual === null) {
$this->notEqual = Yii::t('yii', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.');
}
}
/**
* {@inheritdoc}
*/
public function validateAttribute($model, $attribute)
{
$value = $model->$attribute;
if (!$this->strict && is_scalar($value) && !is_string($value)) {
$value = (string)$value;
}
if (!is_string($value)) {
$this->addError($model, $attribute, $this->message);
return;
}
$length = mb_strlen($value, $this->encoding);
if ($this->min !== null && $length < $this->min) {
$this->addError($model, $attribute, $this->tooShort, ['min' => $this->min]);
}
if ($this->max !== null && $length > $this->max) {
$this->addError($model, $attribute, $this->tooLong, ['max' => $this->max]);
}
if ($this->length !== null && $length !== $this->length) {
$this->addError($model, $attribute, $this->notEqual, ['length' => $this->length]);
}
}
/**
* {@inheritdoc}
*/
protected function validateValue($value)
{
if (!$this->strict && is_scalar($value) && !is_string($value)) {
$value = (string)$value;
}
if (!is_string($value)) {
return [$this->message, []];
}
$length = mb_strlen($value, $this->encoding);
if ($this->min !== null && $length < $this->min) {
return [$this->tooShort, ['min' => $this->min]];
}
if ($this->max !== null && $length > $this->max) {
return [$this->tooLong, ['max' => $this->max]];
}
if ($this->length !== null && $length !== $this->length) {
return [$this->notEqual, ['length' => $this->length]];
}
return null;
}
/**
* {@inheritdoc}
*/
public function clientValidateAttribute($model, $attribute, $view)
{
ValidationAsset::register($view);
$options = $this->getClientOptions($model, $attribute);
return 'yii.validation.string(value, messages, ' . json_encode($options, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . ');';
}
/**
* {@inheritdoc}
*/
public function getClientOptions($model, $attribute)
{
$label = $model->getAttributeLabel($attribute);
$options = [
'message' => $this->formatMessage($this->message, [
'attribute' => $label,
]),
];
if ($this->min !== null) {
$options['min'] = $this->min;
$options['tooShort'] = $this->formatMessage($this->tooShort, [
'attribute' => $label,
'min' => $this->min,
]);
}
if ($this->max !== null) {
$options['max'] = $this->max;
$options['tooLong'] = $this->formatMessage($this->tooLong, [
'attribute' => $label,
'max' => $this->max,
]);
}
if ($this->length !== null) {
$options['is'] = $this->length;
$options['notEqual'] = $this->formatMessage($this->notEqual, [
'attribute' => $label,
'length' => $this->length,
]);
}
if ($this->skipOnEmpty) {
$options['skipOnEmpty'] = 1;
}
return $options;
}
}