44
55namespace App \Validator ;
66
7- use HPlus \ Validate \ Validate ;
7+ use Hyperf \ Validation \ Request \ FormRequest ;
88
99/**
10- * 产品验证器
10+ * 产品验证器(Hyperf 风格)
1111 */
12- class ProductValidator extends Validate
12+ class ProductValidator extends FormRequest
1313{
14- protected $ rule = [
15- 'name ' => 'required|string|between:2,100 ' ,
16- 'description ' => 'string|max:500 ' ,
17- 'price ' => 'required|numeric|min:0 ' ,
18- 'stock ' => 'required|integer|min:0 ' ,
19- 'category_id ' => 'required|integer|min:1 ' ,
20- 'sku ' => 'required|string|max:50|unique:products ' ,
21- 'images ' => 'array|max:10 ' ,
22- 'images.* ' => 'url ' ,
23- 'status ' => 'integer|in:0,1 '
24- ];
25-
26- protected $ message = [
27- 'name.required ' => '产品名称不能为空 ' ,
28- 'name.between ' => '产品名称长度必须在2-100个字符之间 ' ,
29- 'price.required ' => '产品价格不能为空 ' ,
30- 'price.numeric ' => '产品价格必须是数字 ' ,
31- 'price.min ' => '产品价格不能小于0 ' ,
32- 'stock.required ' => '库存数量不能为空 ' ,
33- 'stock.integer ' => '库存数量必须是整数 ' ,
34- 'stock.min ' => '库存数量不能小于0 ' ,
35- 'sku.unique ' => 'SKU已存在 ' ,
36- 'images.max ' => '产品图片最多10张 '
14+ /**
15+ * 场景定义
16+ */
17+ protected array $ scenes = [
18+ 'create ' => ['name ' , 'description ' , 'price ' , 'stock ' , 'category_id ' , 'sku ' , 'images ' , 'status ' ],
19+ 'update ' => ['name ' , 'description ' , 'price ' , 'stock ' , 'category_id ' , 'images ' , 'status ' ],
20+ 'import ' => ['products ' ],
3721 ];
38-
22+
3923 /**
40- * 创建场景
24+ * 验证规则
4125 */
42- protected function sceneCreate ()
26+ public function rules (): array
4327 {
44- return $ this ->only (['name ' , 'description ' , 'price ' , 'stock ' , 'category_id ' , 'sku ' , 'images ' , 'status ' ]);
28+ return [
29+ 'name ' => 'required|string|between:2,100 ' ,
30+ 'description ' => 'string|max:500 ' ,
31+ 'price ' => 'required|numeric|min:0 ' ,
32+ 'stock ' => 'required|integer|min:0 ' ,
33+ 'category_id ' => 'required|integer|min:1 ' ,
34+ 'sku ' => 'required|string|max:50 ' ,
35+ 'images ' => 'array|max:10 ' ,
36+ 'images.* ' => 'url ' ,
37+ 'status ' => 'integer|in:0,1 ' ,
38+ 'products ' => 'required|array|min:1|max:1000 ' ,
39+ 'products.*.name ' => 'required|string|between:2,100 ' ,
40+ 'products.*.price ' => 'required|numeric|min:0 ' ,
41+ 'products.*.stock ' => 'required|integer|min:0 ' ,
42+ 'products.*.sku ' => 'required|string|max:50 ' ,
43+ ];
4544 }
46-
45+
4746 /**
48- * 更新场景
47+ * 错误消息
4948 */
50- protected function sceneUpdate ()
49+ public function messages (): array
5150 {
52- return $ this ->remove ('sku ' , 'unique ' )
53- ->only (['name ' , 'description ' , 'price ' , 'stock ' , 'category_id ' , 'sku ' , 'images ' , 'status ' ]);
51+ return [
52+ 'name.required ' => '产品名称不能为空 ' ,
53+ 'name.between ' => '产品名称长度必须在2-100个字符之间 ' ,
54+ 'price.required ' => '产品价格不能为空 ' ,
55+ 'price.numeric ' => '产品价格必须是数字 ' ,
56+ 'price.min ' => '产品价格不能小于0 ' ,
57+ 'stock.required ' => '库存数量不能为空 ' ,
58+ 'stock.integer ' => '库存数量必须是整数 ' ,
59+ 'stock.min ' => '库存数量不能小于0 ' ,
60+ 'images.max ' => '产品图片最多10张 ' ,
61+ ];
5462 }
55-
63+
5664 /**
57- * 导入场景
65+ * 字段别名
5866 */
59- protected function sceneImport ()
67+ public function attributes (): array
6068 {
61- return $ this ->only (['products ' ])
62- ->rule ('products ' , 'required|array|min:1|max:1000 ' )
63- ->rule ('products.*.name ' , 'required|string|between:2,100 ' )
64- ->rule ('products.*.price ' , 'required|numeric|min:0 ' )
65- ->rule ('products.*.stock ' , 'required|integer|min:0 ' )
66- ->rule ('products.*.sku ' , 'required|string|max:50 ' );
69+ return [
70+ 'name ' => '产品名称 ' ,
71+ 'price ' => '价格 ' ,
72+ 'stock ' => '库存 ' ,
73+ 'category_id ' => '分类 ' ,
74+ 'sku ' => 'SKU ' ,
75+ ];
6776 }
68- }
77+ }
0 commit comments