RequiredWith   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 33
Duplicated Lines 0 %

Test Coverage

Coverage 95.24%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 20
c 1
b 0
f 0
dl 0
loc 33
ccs 20
cts 21
cp 0.9524
rs 10
wmc 8

2 Methods

Rating   Name   Duplication   Size   Complexity  
A getMetadata() 0 10 1
B validate() 0 19 7
1
<?php declare(strict_types=1);
2
3
namespace Formularium\Validator;
4
5
use Formularium\Datatype;
6
use Formularium\Exception\ValidatorException;
7
use Formularium\Field;
8
use Formularium\Model;
9
use Formularium\ValidatorInterface;
10
use Formularium\Metadata;
11
use Formularium\MetadataParameter;
12
13
/**
14
 * The field under validation must be present and not empty only if any of the other specified fields are present.
15
 */
16
class RequiredWith implements ValidatorInterface
17
{
18 2
    public static function validate($value, array $options = [], ?Model $model = null)
19
    {
20 2
        if (!$model) {
21
            throw new ValidatorException("RequiredWith needs a model");
22
        }
23
24 2
        $expectedFields = $options['fields'];
25 2
        $found = false;
26 2
        $data = $model->getData();
27 2
        foreach ($expectedFields as $ef) {
28 2
            if (array_key_exists($ef, $data) && !empty($data[$ef])) {
29 2
                $found = true;
30 2
                break;
31
            }
32
        }
33 2
        if ($found && empty($value)) {
34 1
            throw new ValidatorException("Field is required when at least one of fields " . implode(',', $expectedFields) . ' are present');
35
        }
36 1
        return $value;
37
    }
38
39 1
    public static function getMetadata(): Metadata
40
    {
41 1
        return new Metadata(
42 1
            'RequiredWith',
43 1
            "The field under validation must be present and not empty only if any of the other specified fields are present.",
44
            [
45 1
                new MetadataParameter(
46 1
                    'fields',
47 1
                    '[String]',
48 1
                    'The fields that are required with'
49
                )
50
            ]
51
        );
52
    }
53
}
54