Laravel 验证Requests

trait SceneValidator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php
 
namespace App\Http\Requests;
 
use Illuminate\Contracts\Validation\{Factory, Validator};
 
trait SceneValidator
{
    protected $scene = null;
 
    protected $onlyRule = [];
 
    protected $autoValidate = true;
 
    /**
     * Validate.
     *
     * @param string|array $scene
     */
    public function validate($scene = '')
    {
        if (!$this->autoValidate) {
            if (is_array($scene)) {
                $this->onlyRule = $scene;
            } else {
                $this->scene = $scene;
            }
 
            $this->handleValidate();
        }
    }
 
    /**
     * 覆盖 ValidatesWhenResolvedTrait->validateResolved
     */
    public function validateResolved()
    {
        if (method_exists($this, 'autoValidate')) {
            $this->autoValidate = $this->container->call([$this, 'autoValidate']);
        }
 
        if ($this->autoValidate) {
            $this->handleValidate();
        }
    }
 
    /**
     * Handle validate.
     */
    protected function handleValidate()
    {
        parent::validateResolved();
    }
 
    /**
     * 定义 FormRequest->getValidatorInstance 下 validator 验证器
     *
     * @param Factory $factory
     *
     * @return Validator
     */
    public function validator(Factory $factory)
    {
        $validationData = $this->isMethod('GET') ? $this->query() : $this->post();
        return $factory->make($validationData, $this->getRules(), $this->messages(), $this->attributes());
    }
 
    /**
     * Get rules.
     *
     * @return array
     */
    protected function getRules()
    {
        return $this->handleScene($this->container->call([$this, 'rules']));
    }
 
    /**
     * Handle scene.
     *
     * @param array $rules
     *
     * @return array
     */
    protected function handleScene(array $rules)
    {
        if ($this->onlyRule) {
            return $this->handleRules($this->onlyRule, $rules);
        }
 
        if (!empty($this->scene) && method_exists($this, 'scene')) {
            $scene = $this->container->call([$this, 'scene']);
            if (array_key_exists($this->scene, $scene)) {
                return $this->handleRules($scene[$this->scene], $rules);
            }
        }
 
        return $rules;
    }
 
    /**
     * Handle rules.
     *
     * @param array $sceneRules
     * @param array $rules
     *
     * @return array
     */
    protected function handleRules(array $sceneRules, array $rules)
    {
        $result = [];
        foreach ($sceneRules as $key => $value) {
            if (is_numeric($key) && array_key_exists($value, $rules)) {
                $result[$value] = $rules[$value];
            } else {
                $result[$key] = $value;
            }
        }
 
        return $result;
    }
}
BaseRequests
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
 
namespace App\Http\Requests;
 
use App\Lib\Helper;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
 
class BaseRequests extends FormRequest
{
    /**
     * validate验证失败模板
     * @param Validator $validator
     */
    protected function failedValidation(Validator $validator)
    {
        $message = $validator->getMessageBag()->first();
        throw (new HttpResponseException(Helper::appError($message,405)));
    }
}
CommonRequests
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
 
namespace App\Http\Requests;
 
class CommonRequests extends BaseRequests
{
    use SceneValidator;
 
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }
}

 使用:

AssetCardRequest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php
 
namespace App\Http\Requests\Asset;
 
use App\Http\Requests\CommonRequests;
 
class AssetCardRequest extends CommonRequests
{
    protected $autoValidate = false;
 
    public function rules()
    {
        $mobile = request('id') ? 'required|mobile|unique:asset_cards,mobile,' . request('id')
            : 'required|mobile|unique:asset_cards,mobile';
        return [
            'id' => 'required',
            'device_id' => 'nullable',
            'mobile' => $mobile,
            'operator' => 'required',
            'type' => 'required|in:0,1,2,3',
            'fee' => 'required',
            'outbound_minute' => 'required',
            'flow' => 'required',
            'account_holder' => 'required',
            'real_name' => 'required',
//            'real_id_no' => [
//                'required',
//                'regex:/^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/'
//            ],
            'real_mobile' => 'required|mobile',
            'status_id' => 'required',
            'remark' => 'nullable',
        ];
    }
 
    public function scene()
    {
        return [
            'add' => [
                'device_id',
                'mobile',
                'operator',
                'type',
                'fee',
                'outbound_minute',
                'flow',
                'account_holder',
                'real_name',
//                'real_id_no',
                'real_mobile',
                'status_id',
                'remark'
            ],
            'edit' => [
                'id',
                'device_id',
                'mobile',
                'operator',
                'type',
                'fee',
                'outbound_minute',
                'flow',
                'account_holder',
                'real_name',
//                'real_id_no',
                'real_mobile',
                'status_id',
                'remark'
            ]
        ];
    }
 
    public function messages()
    {
        return [
            'id.required' => '请选择数据',
            'device_id.required' => '请选择使用设备',
            'mobile.required' => '请填写手机号码',
            'mobile.mobile' => '手机号码格式不正确',
            'mobile.unique' => '手机号码已存在',
            'operator.required' => '请填写运营商',
            'type.required' => '请选择卡种类',
            'fee.required' => '请填写卡套餐/月',
            'outbound_minute.required' => '请填写外呼分钟数',
            'flow.required' => '请填写月流量(G)',
            'account_holder.required' => '请填写开户人',
            'real_name.required' => '请填写实名姓名',
            'real_id_no.required' => '请填写实名身份证号码',
            'real_id_no.regex' => '实名身份证号码格式不正确',
            'real_mobile.required' => '请填写实名手机号码',
            'real_mobile.mobile' => '实名手机号码格式错误',
            'status_id.required' => '请选择卡状态'
        ];
 
    }
}

  控制器:

posted @   心之所依  阅读(333)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示