laravel 自定义请求验证类

本文介绍了如何在Laravel中创建自定义请求验证类,以实现控制器与验证逻辑的分离,提高代码复用性。通过将表单验证放在Request类中,可以更方便地管理验证规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

laravel的验证可以直接在控制器里面这样验证:

    $validatedData = $this->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);
    if ($validatedData ->fails()) {
        //未通过处理
    }

Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
])->validate();

但在控制器里面直接验证,没有做到分离。这样我们可以把表单验证放在一个Request类里,实现高度可复用,下面是具体实现:

<?php
namespace App\Http\Requests;

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Validation\ValidationException;
class YarnSalesOrderRequest extends Request
{
    protected function failedValidation(Validator $validator)
    {
        throw new ValidationException($validator, $this->response(
            $this->formatErrors($validator)));
    }

    /**
     * 重写错误提示方法
     * @param Validator $validator
     * @return array
     */
    protected function formatErrors(Validator $validator)
    {
        $message = $validator->errors()->all();
        $result = [
            'message' => $message[0],//这里只需要返回第一个提示信息
        ];
        return $result;
    }

    /**
     * 验证规则,需要验证的字段
     * @var array
     */
    protected $_rules = [
        'type' => 'required|integer|regex:/^[1-9][0-9]*$/',//正则验证正整数
        'contact' => 'required',
        'supplier_id' => 'required|integer|regex:/^[1-9][0-9]*$/',
        'version' => 'required|integer|min:1',
        'company_id' => 'same:supplier_id'
    ];

    /**
     * 字段属性名称
     * @var array
     */
    protected $_attributes = [
        'type' => '订单类型',
        'customer_id' => '客户',
        'contact' => '联系方式',
        'supplier_id' => '供货商',
        'company_id' => '公司',
    ];

    /**
     * 提示信息
     * @var array
     */
    protected $_messages = [
        'required' => '为必填项',
        'min' => '最小为:min',
        'max' => '最大为:max',
        'between' => '长度在:min和:max之间',
        'integer' => '不能为空',
        'same' => '必须与供货商一致',
        'numeric' => '必须为数值',
        'regex' => '不能为空或不符合规则',
    ];

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;//默认值false修改为true
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $rules = $this->_rules;
        //处理分录字段
        foreach ($this->request->get('details') as $key => $value) {
            $rules['details.' . $key . '.seq'] = 'integer';    
            $rules['details.' . $key . '.quantity'] = 'required|numeric|regex:/^\d+(\.\d+)?$/';
            $rules['details.' . $key . '.unit_id'] = 'integer|regex:/^[1-9][0-9]*$/';
            $rules['details.' . $key . '.unit_price'] = 'numeric|regex:/^\d+(\.\d+)?$/';
            $rules['details.' . $key . '.money'] = 'numeric|regex:/^\d+(\.\d+)?$/';          
        }
        return $rules;
    }

    /**
     * 返回错误信息
     * @return array|mixed
     */
    public function messages()
    {
        $_rules = $this->rules();
        $attributes = $this->_attributes;
        $messages = $this->_messages;
        $data = [];
        foreach ($_rules as $key => $rule) {
            $new_rules = explode('|', $rule);//分割成数组
            $rule_key = $key;
            if (str_contains($rule_key, '.')) {
                $rule_key = substr(strrchr($rule_key, '.'), 1);
            }
            foreach ($new_rules as $new_rule) {
                $head = strstr($new_rule, ':', true);//截取:之前的字符串
                if ($head) {
                    $new_rule = $head;
                }
                $data[$key . '.' . $new_rule] = $attributes[$rule_key] . $messages[$new_rule];
            }
        }
        return $data;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值