Skip to content

Commit 4d346c9

Browse files
authored
Merge pull request #19 from rakit/add-conditional-required-rules
Add some conditional required rules
2 parents 981d35c + 1e9018e commit 4d346c9

File tree

8 files changed

+347
-26
lines changed

8 files changed

+347
-26
lines changed

README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,11 @@ Below is list of all available validation rules
264264

265265
* [required](#rule-required)
266266
* [required_if](#rule-required_if)
267+
* [required_unless](#rule-required_unless)
268+
* [required_with](#rule-required_with)
269+
* [required_without](#rule-required_without)
270+
* [required_with_all](#rule-required_with_all)
271+
* [required_without_all](#rule-required_without_all)
267272
* [uploaded_file](#rule-uploaded_file)
268273
* [email](#rule-email)
269274
* [alpha](#rule-alpha)
@@ -316,6 +321,31 @@ The field under this rule must be present and not empty if the anotherfield fiel
316321

317322
For example `required_if:something,1,yes,on` will be required if `something` value is one of `1`, `'1'`, `'yes'`, or `'on'`.
318323

324+
<a id="rule-required_unless"></a>
325+
#### required_unless:another_field,value_1,value_2,...
326+
327+
The field under validation must be present and not empty unless the anotherfield field is equal to any value.
328+
329+
<a id="rule-required_with"></a>
330+
#### required_with:field_1,field_2,...
331+
332+
The field under validation must be present and not empty only if any of the other specified fields are present.
333+
334+
<a id="rule-required_without"></a>
335+
#### required_without:field_1,field_2,...
336+
337+
The field under validation must be present and not empty only when any of the other specified fields are not present.
338+
339+
<a id="rule-required_with_all"></a>
340+
#### required_with_all:field_1,field_2,...
341+
342+
The field under validation must be present and not empty only if all of the other specified fields are present.
343+
344+
<a id="rule-required_without_all"></a>
345+
#### required_without_all:field_1,field_2,...
346+
347+
The field under validation must be present and not empty only when all of the other specified fields are not present.
348+
319349
<a id="rule-uploaded_file"></a>
320350
#### uploaded_file:min_size,max_size,file_type_a,file_type_b,...
321351

src/Rules/RequiredUnless.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
namespace Rakit\Validation\Rules;
4+
5+
use Rakit\Validation\Rule;
6+
7+
class RequiredUnless extends Required
8+
{
9+
protected $implicit = true;
10+
11+
protected $message = "The :attribute is required";
12+
13+
public function fillParameters(array $params)
14+
{
15+
$this->params['field'] = array_shift($params);
16+
$this->params['values'] = $params;
17+
return $this;
18+
}
19+
20+
public function check($value)
21+
{
22+
$this->requireParameters(['field', 'values']);
23+
24+
$anotherAttribute = $this->parameter('field');
25+
$definedValues = $this->parameter('values');
26+
$anotherValue = $this->validation->getValue($anotherAttribute);
27+
28+
$validator = $this->validation->getValidator();
29+
$required_validator = $validator('required');
30+
31+
if (!in_array($anotherValue, $definedValues)) {
32+
$this->setAttributeAsRequired();
33+
return $required_validator->check($value, []);
34+
}
35+
36+
return true;
37+
}
38+
39+
}

src/Rules/RequiredWith.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace Rakit\Validation\Rules;
4+
5+
use Rakit\Validation\Rule;
6+
7+
class RequiredWith extends Required
8+
{
9+
protected $implicit = true;
10+
11+
protected $message = "The :attribute is required";
12+
13+
public function fillParameters(array $params)
14+
{
15+
$this->params['fields'] = $params;
16+
return $this;
17+
}
18+
19+
public function check($value)
20+
{
21+
$this->requireParameters(['fields']);
22+
$fields = $this->parameter('fields');
23+
$validator = $this->validation->getValidator();
24+
$required_validator = $validator('required');
25+
26+
foreach($fields as $field) {
27+
if ($this->validation->hasValue($field)) {
28+
$this->setAttributeAsRequired();
29+
return $required_validator->check($value, []);
30+
}
31+
}
32+
33+
return true;
34+
}
35+
36+
}

src/Rules/RequiredWithAll.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace Rakit\Validation\Rules;
4+
5+
use Rakit\Validation\Rule;
6+
7+
class RequiredWithAll extends Required
8+
{
9+
protected $implicit = true;
10+
11+
protected $message = "The :attribute is required";
12+
13+
public function fillParameters(array $params)
14+
{
15+
$this->params['fields'] = $params;
16+
return $this;
17+
}
18+
19+
public function check($value)
20+
{
21+
$this->requireParameters(['fields']);
22+
$fields = $this->parameter('fields');
23+
$validator = $this->validation->getValidator();
24+
$required_validator = $validator('required');
25+
26+
foreach($fields as $field) {
27+
if (!$this->validation->hasValue($field)) {
28+
return true;
29+
}
30+
}
31+
32+
$this->setAttributeAsRequired();
33+
return $required_validator->check($value, []);
34+
}
35+
36+
}

src/Rules/RequiredWithout.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace Rakit\Validation\Rules;
4+
5+
use Rakit\Validation\Rule;
6+
7+
class RequiredWithout extends Required
8+
{
9+
protected $implicit = true;
10+
11+
protected $message = "The :attribute is required";
12+
13+
public function fillParameters(array $params)
14+
{
15+
$this->params['fields'] = $params;
16+
return $this;
17+
}
18+
19+
public function check($value)
20+
{
21+
$this->requireParameters(['fields']);
22+
$fields = $this->parameter('fields');
23+
$validator = $this->validation->getValidator();
24+
$required_validator = $validator('required');
25+
26+
foreach($fields as $field) {
27+
if (!$this->validation->hasValue($field)) {
28+
$this->setAttributeAsRequired();
29+
return $required_validator->check($value, []);
30+
}
31+
}
32+
33+
return true;
34+
}
35+
36+
}

src/Rules/RequiredWithoutAll.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace Rakit\Validation\Rules;
4+
5+
use Rakit\Validation\Rule;
6+
7+
class RequiredWithoutAll extends Required
8+
{
9+
protected $implicit = true;
10+
11+
protected $message = "The :attribute is required";
12+
13+
public function fillParameters(array $params)
14+
{
15+
$this->params['fields'] = $params;
16+
return $this;
17+
}
18+
19+
public function check($value)
20+
{
21+
$this->requireParameters(['fields']);
22+
$fields = $this->parameter('fields');
23+
$validator = $this->validation->getValidator();
24+
$required_validator = $validator('required');
25+
26+
foreach($fields as $field) {
27+
if ($this->validation->hasValue($field)) {
28+
return true;
29+
}
30+
}
31+
32+
$this->setAttributeAsRequired();
33+
return $required_validator->check($value, []);
34+
}
35+
36+
}

src/Validator.php

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -73,32 +73,37 @@ public function __invoke($rule)
7373
protected function registerBaseValidators()
7474
{
7575
$baseValidator = [
76-
'required' => new Rules\Required,
77-
'required_if' => new Rules\RequiredIf,
78-
'email' => new Rules\Email,
79-
'alpha' => new Rules\Alpha,
80-
'numeric' => new Rules\Numeric,
81-
'alpha_num' => new Rules\AlphaNum,
82-
'alpha_dash' => new Rules\AlphaDash,
83-
'in' => new Rules\In,
84-
'not_in' => new Rules\NotIn,
85-
'min' => new Rules\Min,
86-
'max' => new Rules\Max,
87-
'between' => new Rules\Between,
88-
'url' => new Rules\Url,
89-
'ip' => new Rules\Ip,
90-
'ipv4' => new Rules\Ipv4,
91-
'ipv6' => new Rules\Ipv6,
92-
'array' => new Rules\TypeArray,
93-
'same' => new Rules\Same,
94-
'regex' => new Rules\Regex,
95-
'date' => new Rules\Date,
96-
'accepted' => new Rules\Accepted,
97-
'present' => new Rules\Present,
98-
'different' => new Rules\Different,
99-
'uploaded_file' => new Rules\UploadedFile,
100-
'before' => new Before,
101-
'after' => new After
76+
'required' => new Rules\Required,
77+
'required_if' => new Rules\RequiredIf,
78+
'required_unless' => new Rules\RequiredUnless,
79+
'required_with' => new Rules\RequiredWith,
80+
'required_without' => new Rules\RequiredWithout,
81+
'required_with_all' => new Rules\RequiredWithAll,
82+
'required_without_all' => new Rules\RequiredWithoutAll,
83+
'email' => new Rules\Email,
84+
'alpha' => new Rules\Alpha,
85+
'numeric' => new Rules\Numeric,
86+
'alpha_num' => new Rules\AlphaNum,
87+
'alpha_dash' => new Rules\AlphaDash,
88+
'in' => new Rules\In,
89+
'not_in' => new Rules\NotIn,
90+
'min' => new Rules\Min,
91+
'max' => new Rules\Max,
92+
'between' => new Rules\Between,
93+
'url' => new Rules\Url,
94+
'ip' => new Rules\Ip,
95+
'ipv4' => new Rules\Ipv4,
96+
'ipv6' => new Rules\Ipv6,
97+
'array' => new Rules\TypeArray,
98+
'same' => new Rules\Same,
99+
'regex' => new Rules\Regex,
100+
'date' => new Rules\Date,
101+
'accepted' => new Rules\Accepted,
102+
'present' => new Rules\Present,
103+
'different' => new Rules\Different,
104+
'uploaded_file' => new Rules\UploadedFile,
105+
'before' => new Before,
106+
'after' => new After
102107
];
103108

104109
foreach($baseValidator as $key => $validator) {

0 commit comments

Comments
 (0)