Skip to content

Commit 181e4ad

Browse files
committed
Allow multiple required_if or required_unless rules
1 parent 82368fb commit 181e4ad

File tree

6 files changed

+32
-4
lines changed

6 files changed

+32
-4
lines changed

src/Mpociot/ApiDoc/Generators/AbstractGenerator.php

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,20 @@ protected function fancyImplode($arr, $first, $last)
188188
return implode($first, $arr);
189189
}
190190

191+
protected function splitValuePairs($parameters, $first = 'is ', $last = 'or ') {
192+
$attribute = '';
193+
collect($parameters)->map(function($item, $key) use (&$attribute, $first, $last) {
194+
$attribute .= '`'.$item.'` ';
195+
if (($key+1) % 2 === 0) {
196+
$attribute .= $last;
197+
} else {
198+
$attribute .= $first;
199+
}
200+
});
201+
$attribute = rtrim($attribute, $last);
202+
return $attribute;
203+
}
204+
191205
/**
192206
* @param string $rule
193207
* @param string $ruleName
@@ -296,10 +310,10 @@ protected function parseRule($rule, $ruleName, &$attributeData, $seed)
296310
$attributeData['description'][] = Description::parse($rule)->with($this->fancyImplode($parameters, ', ', ' or '))->getDescription();
297311
break;
298312
case 'required_if':
299-
$attributeData['description'][] = Description::parse($rule)->with($parameters)->getDescription();
313+
$attributeData['description'][] = Description::parse($rule)->with($this->splitValuePairs($parameters))->getDescription();
300314
break;
301315
case 'required_unless':
302-
$attributeData['description'][] = Description::parse($rule)->with($parameters)->getDescription();
316+
$attributeData['description'][] = Description::parse($rule)->with($this->splitValuePairs($parameters))->getDescription();
303317
break;
304318
case 'required_with':
305319
$attributeData['description'][] = Description::parse($rule)->with($this->fancyImplode($parameters, ', ', ' or '))->getDescription();

src/resources/lang/en/rules.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
'json' => 'Must be a valid JSON string.',
2121
'mimetypes' => 'Allowed mime types: :attribute',
2222
'mimes' => 'Allowed mime types: :attribute',
23-
'required_if' => 'Required if `:attribute` is `:attribute`',
24-
'required_unless' => 'Required unless `:attribute` is `:attribute`',
23+
'required_if' => 'Required if :attribute',
24+
'required_unless' => 'Required unless :attribute',
2525
'required_with' => 'Required if the parameters :attribute are present.',
2626
'required_with_all' => 'Required if the parameters :attribute are present.',
2727
'required_without' => 'Required if the parameters :attribute are not present.',

tests/ApiDocGeneratorTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,12 @@ public function testCanParseFormRequestRules()
267267
$this->assertCount(1, $attribute['description']);
268268
$this->assertSame('Must match this regular expression: `(.*)`', $attribute['description'][0]);
269269
break;
270+
case 'multiple_required_if':
271+
$this->assertFalse($attribute['required']);
272+
$this->assertSame('string', $attribute['type']);
273+
$this->assertCount(1, $attribute['description']);
274+
$this->assertSame('Required if `foo` is `bar` or `baz` is `qux`', $attribute['description'][0]);
275+
break;
270276
case 'required_if':
271277
$this->assertFalse($attribute['required']);
272278
$this->assertSame('string', $attribute['type']);

tests/DingoGeneratorTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,12 @@ public function testCanParseFormRequestRules()
270270
$this->assertCount(1, $attribute['description']);
271271
$this->assertSame('Must match this regular expression: `(.*)`', $attribute['description'][0]);
272272
break;
273+
case 'multiple_required_if':
274+
$this->assertFalse($attribute['required']);
275+
$this->assertSame('string', $attribute['type']);
276+
$this->assertCount(1, $attribute['description']);
277+
$this->assertSame('Required if `foo` is `bar` or `baz` is `qux`', $attribute['description'][0]);
278+
break;
273279
case 'required_if':
274280
$this->assertFalse($attribute['required']);
275281
$this->assertSame('string', $attribute['type']);

tests/Fixtures/DingoTestRequest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public function rules()
4141
'numeric' => 'numeric',
4242
'regex' => 'regex:(.*)',
4343
'required_if' => 'required_if:foo,bar',
44+
'multiple_required_if' => 'required_if:foo,bar,baz,qux',
4445
'required_unless' => 'required_unless:foo,bar',
4546
'required_with' => 'required_with:foo,bar,baz',
4647
'required_with_all' => 'required_with_all:foo,bar,baz',

tests/Fixtures/TestRequest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public function rules()
4141
'numeric' => 'numeric',
4242
'regex' => 'regex:(.*)',
4343
'required_if' => 'required_if:foo,bar',
44+
'multiple_required_if' => 'required_if:foo,bar,baz,qux',
4445
'required_unless' => 'required_unless:foo,bar',
4546
'required_with' => 'required_with:foo,bar,baz',
4647
'required_with_all' => 'required_with_all:foo,bar,baz',

0 commit comments

Comments
 (0)