-
-
Notifications
You must be signed in to change notification settings - Fork 39
/
Count.php
145 lines (136 loc) · 5.58 KB
/
Count.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
<?php
declare(strict_types=1);
namespace Yiisoft\Validator\Rule;
use Attribute;
use Closure;
use Countable;
use Yiisoft\Validator\CountableLimitInterface;
use Yiisoft\Validator\Rule\Trait\CountableLimitTrait;
use Yiisoft\Validator\Rule\Trait\SkipOnEmptyTrait;
use Yiisoft\Validator\Rule\Trait\SkipOnErrorTrait;
use Yiisoft\Validator\Rule\Trait\WhenTrait;
use Yiisoft\Validator\RuleWithOptionsInterface;
use Yiisoft\Validator\SkipOnEmptyInterface;
use Yiisoft\Validator\SkipOnErrorInterface;
use Yiisoft\Validator\WhenInterface;
/**
* Defines validation options to check that the value contains certain number of items.
* Can be applied to arrays or classes implementing {@see Countable} interface.
*
* @see CountHandler
*
* @psalm-import-type SkipOnEmptyValue from SkipOnEmptyInterface
* @psalm-import-type WhenType from WhenInterface
*/
#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)]
final class Count implements
RuleWithOptionsInterface,
SkipOnErrorInterface,
WhenInterface,
SkipOnEmptyInterface,
CountableLimitInterface
{
use CountableLimitTrait;
use SkipOnEmptyTrait;
use SkipOnErrorTrait;
use WhenTrait;
/**
* @param int|null $exactly Exact number of items. `null` means no strict comparison. Mutually exclusive with
* {@see $min} and {@see $max}.
* @param int|null $min Minimum number of items. null means no minimum number limit. Can't be combined with
* {@see $exactly}. See {@see $lessThanMinMessage} for the customized message for a value with too few items.
* @param int|null $max Maximum number of items. null means no maximum number limit. Can't be combined with
* {@see $exactly}. See {@see $greaterThanMaxMessage} for the customized message for a value with too many items.
* @param string $incorrectInputMessage Error message used when the value is neither an array nor an object
* implementing {@see \Countable} interface.
*
* You may use the following placeholders in the message:
*
* - `{attribute}`: the translated label of the attribute being validated.
* - `{type}`: the type of the value being validated.
* @param string $lessThanMinMessage Error message used when the number of items is smaller than {@see $min}.
*
* You may use the following placeholders in the message:
*
* - `{attribute}`: the translated label of the attribute being validated.
* - `{min}`: minimum number of items required.
* - `{number}`: actual number of items.
* @param string $greaterThanMaxMessage Error message used when the number of items is greater than {@see $max}.
*
* You may use the following placeholders in the message:
*
* - `{attribute}`: the translated label of the attribute being validated.
* - `{max}`: maximum number of items required.
* - `{number}`: actual number of items.
* @param string $notExactlyMessage Error message used when the number of items does not equal {@see $exactly}.
*
* You may use the following placeholders in the message:
*
* - `{attribute}`: the translated label of the attribute being validated.
* - `{exactly}`: exact number of items required.
* - `{number}`: actual number of items.
* @param bool|callable|null $skipOnEmpty Whether to skip this rule if the value validated is empty.
* See {@see SkipOnEmptyInterface}.
* @param bool $skipOnError Whether to skip this rule if any of the previous rules gave an error.
* See {@see SkipOnErrorInterface}.
* @param Closure|null $when A callable to define a condition for applying the rule.
* See {@see WhenInterface}.
*
* @psalm-param SkipOnEmptyValue $skipOnEmpty
* @psalm-param WhenType $when
*/
public function __construct(
int|null $exactly = null,
int|null $min = null,
int|null $max = null,
private string $incorrectInputMessage = 'This value must be an array or implement \Countable interface.',
string $lessThanMinMessage = 'This value must contain at least {min, number} {min, plural, one{item} ' .
'other{items}}.',
string $greaterThanMaxMessage = 'This value must contain at most {max, number} {max, plural, one{item} ' .
'other{items}}.',
string $notExactlyMessage = 'This value must contain exactly {exactly, number} {exactly, plural, one{item} ' .
'other{items}}.',
private mixed $skipOnEmpty = null,
private bool $skipOnError = false,
private Closure|null $when = null,
) {
$this->initCountableLimitProperties(
$min,
$max,
$exactly,
$lessThanMinMessage,
$greaterThanMaxMessage,
$notExactlyMessage
);
}
public function getName(): string
{
return 'count';
}
/**
* Get error message used when the value is neither an array nor an object implementing {@see \Countable} interface.
*
* @return string Error message.
*
* @see $incorrectInputMessage
*/
public function getIncorrectInputMessage(): string
{
return $this->incorrectInputMessage;
}
public function getOptions(): array
{
return array_merge($this->getLimitOptions(), [
'incorrectInputMessage' => [
'template' => $this->getIncorrectInputMessage(),
'parameters' => [],
],
'skipOnEmpty' => $this->getSkipOnEmptyOption(),
'skipOnError' => $this->skipOnError,
]);
}
public function getHandler(): string
{
return CountHandler::class;
}
}