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' => '请选择卡状态' ]; } } |
控制器:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架