Passed
Push — master ( 2b6758...acf834 )
by Aleksei
06:59
created

AtLeast   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 72
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 24
c 1
b 0
f 0
dl 0
loc 72
ccs 24
cts 24
cp 1
rs 10
wmc 7

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A validateValue() 0 24 4
A min() 0 5 1
A getOptions() 0 6 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Validator\Rule;
6
7
use Yiisoft\Validator\DataSetInterface;
8
use Yiisoft\Validator\HasValidationErrorMessage;
9
use Yiisoft\Validator\Result;
10
use Yiisoft\Validator\Rule;
11
12
/**
13
 * AtLeastValidator checks if at least $min of many attributes are filled.
14
 */
15
class AtLeast extends Rule
16
{
17
    use HasValidationErrorMessage;
18
19
    /**
20
     * The minimum required quantity of filled attributes to pass the validation.
21
     * Defaults to 1.
22
     */
23
    private int $min = 1;
24
25
    /**
26
     * The list of required attributes that will be checked.
27
     */
28
    private array $attributes;
29
30
    /**
31
     * Message to display in case of error.
32
     */
33
    private string $message = 'The model is not valid. Must have at least "{min}" filled attributes.';
34
35
    /**
36
     * @param array $attributes The list of required attributes that will be checked.
37
     */
38 5
    public function __construct(array $attributes)
39
    {
40 5
        $this->attributes = $attributes;
41 5
    }
42
43 4
    protected function validateValue($value, DataSetInterface $dataSet = null): Result
44
    {
45 4
        $filledCount = 0;
46
47 4
        foreach ($this->attributes as $attribute) {
48 4
            if (!$this->isEmpty($value->{$attribute})) {
49 3
                $filledCount++;
50
            }
51
        }
52
53 4
        $result = new Result();
54
55 4
        if ($filledCount < $this->min) {
56 2
            $result->addError(
57 2
                $this->translateMessage(
58 2
                    $this->message,
59
                    [
60 2
                        'min' => $this->min,
61
                    ]
62
                )
63
            );
64
        }
65
66 4
        return $result;
67
    }
68
69
    /**
70
     * @param int $value The minimum required quantity of filled attributes to pass the validation.
71
     *
72
     * @return self
73
     */
74 1
    public function min(int $value): self
75
    {
76 1
        $new = clone $this;
77 1
        $new->min = $value;
78 1
        return $new;
79
    }
80
81 2
    public function getOptions(): array
82
    {
83 2
        return array_merge(
84 2
            parent::getOptions(),
85 2
            ['min' => $this->min],
86 2
            ['message' => $this->translateMessage($this->message, ['min' => $this->min])],
87
        );
88
    }
89
}
90