Skip to content

Commit c7b304b

Browse files
authored
Support to rewrite the rules for scene when using validation. (#7469)
1 parent e26ce02 commit c7b304b

File tree

3 files changed

+25
-2
lines changed

3 files changed

+25
-2
lines changed

src/Request/FormRequest.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
namespace Hyperf\Validation\Request;
1414

15-
use Hyperf\Collection\Arr;
1615
use Hyperf\Context\Context;
1716
use Hyperf\Context\ResponseContext;
1817
use Hyperf\Contract\ValidatorInterface;
@@ -205,7 +204,15 @@ protected function getRules(): array
205204
$rules = $this->rules();
206205
$scene = $this->getScene();
207206
if ($scene && isset($this->scenes[$scene]) && is_array($this->scenes[$scene])) {
208-
return Arr::only($rules, $this->scenes[$scene]);
207+
$result = [];
208+
foreach ($this->scenes[$scene] as $key => $value) {
209+
if (is_string($key)) {
210+
$result[$key] = $value;
211+
} elseif (is_numeric($key) && is_string($value)) {
212+
$result[$value] = $rules[$value];
213+
}
214+
}
215+
return $result;
209216
}
210217
return $rules;
211218
}

tests/Cases/FormRequestTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Hyperf\Coroutine\Waiter;
2020
use Hyperf\HttpMessage\Server\Response;
2121
use Hyperf\HttpMessage\Upload\UploadedFile;
22+
use Hyperf\Support\Reflection\ClassInvoker;
2223
use Hyperf\Translation\ArrayLoader;
2324
use Hyperf\Translation\Translator;
2425
use Hyperf\Validation\Contract\ValidatorFactoryInterface;
@@ -117,6 +118,20 @@ public function testRewriteGetRules()
117118
}
118119
}
119120

121+
public function testRewriteRules()
122+
{
123+
$container = Mockery::mock(ContainerInterface::class);
124+
125+
$request = new FooSceneRequest($container);
126+
$invoker = new ClassInvoker($request);
127+
$rules = $invoker->getRules();
128+
$this->assertSame(['mobile' => 'required', 'name' => 'required'], $rules);
129+
130+
$invoker->scene('get');
131+
$rules = $invoker->getRules();
132+
$this->assertSame(['mobile' => 'string|required'], $rules);
133+
}
134+
120135
public function testSceneForFormRequest()
121136
{
122137
$psrRequest = Mockery::mock(ServerRequestPlusInterface::class);

tests/Cases/Stub/FooSceneRequest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class FooSceneRequest extends FormRequest
1919
public array $scenes = [
2020
'save' => ['mobile', 'name'],
2121
'info' => ['mobile'],
22+
'get' => ['mobile' => 'string|required'],
2223
];
2324

2425
public function authorize(): bool

0 commit comments

Comments
 (0)