ExclusiveValidationRulesServiceProvider   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 75
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 39
c 1
b 0
f 0
dl 0
loc 75
rs 10
wmc 7

2 Methods

Rating   Name   Duplication   Size   Complexity  
A register() 0 2 1
B boot() 0 62 6
1
<?php
2
3
namespace Thedavefulton\LaravelExclusiveValidationRules;
4
5
use Illuminate\Support\ServiceProvider;
6
use Illuminate\Support\Facades\Validator;
7
8
class ExclusiveValidationRulesServiceProvider extends ServiceProvider
9
{
10
    /**
11
     * Bootstrap the application services.
12
     */
13
    public function boot()
14
    {
15
        Validator::extendImplicit('required_exclusive', function ($attribute, $value, $parameters, $validator) {
16
            $validator->requireParameterCount(1, $parameters, 'required_exclusive');
17
18
            $data = $validator->getData();
19
            $count = collect($parameters)
20
                ->filter(function ($parameter) use ($data) {
21
                    return array_key_exists($parameter, $data);
22
                })
23
                ->filter(function ($parameter) use ($validator, $data) {
24
                    return $validator->validateRequired($parameter, $data[$parameter]);
25
                })->count();
26
27
            if (! $validator->validateRequired($attribute, $value)) {
28
                return $count === 1;
29
            }
30
31
            if ($validator->validateRequired($attribute, $value)) {
32
                return $count === 0;
33
            }
34
        });
35
36
        Validator::replacer('required_exclusive', function ($message, $attribute, $rule, $parameters) {
37
            // dd($message, $attribute, $rule, $parameters);
38
            $fields = collect($parameters)
39
                ->push($attribute)
40
                ->sort()
41
                ->implode(', ');
42
43
            return "You must submit exactly one of: {$fields}";
44
        });
45
46
        Validator::extendImplicit('optional_exclusive', function ($attribute, $value, $parameters, $validator) {
47
            $validator->requireParameterCount(1, $parameters, 'required_exclusive');
48
49
            $data = $validator->getData();
50
            $count = collect($parameters)
51
                ->filter(function ($parameter) use ($data) {
52
                    return array_key_exists($parameter, $data);
53
                })
54
                ->filter(function ($parameter) use ($validator, $data) {
55
                    return $validator->validateRequired($parameter, $data[$parameter]);
56
                })->count();
57
58
            if (! $validator->validateRequired($attribute, $value)) {
59
                return $count === 0 || $count === 1;
60
            }
61
62
            if ($validator->validateRequired($attribute, $value)) {
63
                return $count === 0;
64
            }
65
        });
66
67
        Validator::replacer('optional_exclusive', function ($message, $attribute, $rule, $parameters) {
68
            // dd($message, $attribute, $rule, $parameters);
69
            $fields = collect($parameters)
70
                ->push($attribute)
71
                ->sort()
72
                ->implode(', ');
73
74
            return "You must submit exactly one or none of: {$fields}";
75
        });
76
    }
77
78
    /**
79
     * Register the application services.
80
     */
81
    public function register()
82
    {
83
        //
84
    }
85
}
86