Skip to content

Commit 2f4b92d

Browse files
committed
Update
1 parent c87ca7b commit 2f4b92d

3 files changed

Lines changed: 179 additions & 0 deletions

File tree

README.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,32 @@ class UserController
205205
}
206206
```
207207

208+
### Validation Data Source
209+
210+
```php
211+
use support\validation\annotation\Validate;
212+
213+
class UserController
214+
{
215+
#[Validate(
216+
rules: ['email' => 'required|email'],
217+
in: ['query', 'body', 'path']
218+
)]
219+
public function send()
220+
{
221+
return json(['code' => 0, 'msg' => 'ok']);
222+
}
223+
}
224+
```
225+
226+
Use `in` to specify where validation data comes from:
227+
228+
* **query** – HTTP query parameters from `$request->get()`
229+
* **body** – HTTP body from `$request->post()`
230+
* **path** – Path/route parameters from `$request->route->param()`
231+
232+
`in` can be a string or array; when it's an array, values are merged in order and later sources override earlier ones. When `in` is omitted, it defaults to the equivalent of `['query', 'body', 'path']`.
233+
208234
## Parameter-Level Validation (Param)
209235

210236
### Basic Usage
@@ -224,6 +250,23 @@ class MailController
224250
}
225251
```
226252

253+
### Validation Data Source
254+
255+
Parameter-level validation also supports the `in` parameter to specify data source:
256+
257+
```php
258+
use support\validation\annotation\Param;
259+
260+
class MailController
261+
{
262+
public function send(
263+
#[Param(rules: 'required|email', in: ['body'])] string $from
264+
) {
265+
return json(['code' => 0, 'msg' => 'ok']);
266+
}
267+
}
268+
```
269+
227270
### Rules Support String or Array
228271

229272
```php

README.zh-CN.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,32 @@ class UserController
206206
}
207207
```
208208

209+
### 验证数据来源
210+
```php
211+
use support\validation\annotation\Validate;
212+
213+
class UserController
214+
{
215+
#[Validate(
216+
rules: ['email' => 'required|email'],
217+
in: ['query', 'body', 'path']
218+
)]
219+
public function send()
220+
{
221+
return json(['code' => 0, 'msg' => 'ok']);
222+
}
223+
}
224+
```
225+
226+
通过`in`参数来指定数据来源,其中:
227+
228+
* **query** http请求的query参数,取自 `$request->get()`
229+
* **body** http请求的包体,取自 `$request->post()`
230+
* **path** http请求的路径参数,取自 `$request->route->param()`
231+
232+
`in`可为字符串或数组;为数组时按顺序合并,后者覆盖前者。未传递`in`时默认等效于 `['query', 'body', 'path']`
233+
234+
209235
## 参数级验证(Param)
210236

211237
### 基本用法
@@ -225,6 +251,24 @@ class MailController
225251
}
226252
```
227253

254+
### 验证数据来源
255+
256+
类似的,参数级也支持`in`参数指定来源
257+
258+
```php
259+
use support\validation\annotation\Param;
260+
261+
class MailController
262+
{
263+
public function send(
264+
#[Param(rules: 'required|email', in: ['body'])] string $from
265+
) {
266+
return json(['code' => 0, 'msg' => 'ok']);
267+
}
268+
}
269+
```
270+
271+
228272
### rules 支持字符串或数组
229273

230274
```php

src/Tests/ValidateMiddlewareTest.php

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,56 @@ public function testParamInPathReadsFromPathOnly(): void
195195
$this->assertTrue($called);
196196
}
197197

198+
public function testValidateInWithValidatorQueryBodyOrderPass(): void
199+
{
200+
$request = $this->makeRequest(
201+
controller: InWithValidatorQueryBodyController::class,
202+
action: 'send',
203+
query: ['id' => 1],
204+
body: ['id' => 2]
205+
);
206+
207+
$called = false;
208+
(new Middleware())->process($request, function () use (&$called) {
209+
$called = true;
210+
return 'ok';
211+
});
212+
213+
$this->assertTrue($called);
214+
}
215+
216+
public function testValidateInWithValidatorBodyQueryOrderFail(): void
217+
{
218+
$request = $this->makeRequest(
219+
controller: InWithValidatorBodyQueryController::class,
220+
action: 'send',
221+
query: ['id' => 1],
222+
body: ['id' => 2]
223+
);
224+
225+
$this->expectException(ValidationException::class);
226+
$this->expectExceptionMessage('ID invalid');
227+
(new Middleware())->process($request, fn () => 'ok');
228+
}
229+
230+
public function testValidateInWithValidatorPathPass(): void
231+
{
232+
$request = $this->makeRequest(
233+
controller: InWithValidatorPathController::class,
234+
action: 'send',
235+
query: ['id' => 1],
236+
routeParams: ['id' => 7]
237+
);
238+
239+
$called = false;
240+
(new Middleware())->process($request, function () use (&$called) {
241+
$called = true;
242+
return 'ok';
243+
});
244+
245+
$this->assertTrue($called);
246+
}
247+
198248
public function testValidateInUnsupportedValueThrows(): void
199249
{
200250
$request = $this->makeRequest(
@@ -1144,6 +1194,48 @@ public function send(Request $request): void
11441194
}
11451195
}
11461196

1197+
final class InWithValidatorId2Validator extends Validator
1198+
{
1199+
protected array $rules = [
1200+
'id' => 'required|integer|in:2',
1201+
];
1202+
1203+
protected array $messages = [
1204+
'id.in' => 'ID invalid',
1205+
];
1206+
}
1207+
1208+
final class InWithValidatorId7Validator extends Validator
1209+
{
1210+
protected array $rules = [
1211+
'id' => 'required|integer|in:7',
1212+
];
1213+
}
1214+
1215+
final class InWithValidatorQueryBodyController
1216+
{
1217+
#[Validate(in: ['query', 'body'], validator: InWithValidatorId2Validator::class)]
1218+
public function send(Request $request): void
1219+
{
1220+
}
1221+
}
1222+
1223+
final class InWithValidatorBodyQueryController
1224+
{
1225+
#[Validate(in: ['body', 'query'], validator: InWithValidatorId2Validator::class)]
1226+
public function send(Request $request): void
1227+
{
1228+
}
1229+
}
1230+
1231+
final class InWithValidatorPathController
1232+
{
1233+
#[Validate(in: 'path', validator: InWithValidatorId7Validator::class)]
1234+
public function send(Request $request): void
1235+
{
1236+
}
1237+
}
1238+
11471239
final class ParamController
11481240
{
11491241
public function send(

0 commit comments

Comments
 (0)