前言:
目前朋友们对“php网络验证”大致比较珍视,各位老铁们都需要分析一些“php网络验证”的相关文章。那么小编同时在网摘上收集了一些有关“php网络验证””的相关内容,希望朋友们能喜欢,兄弟们一起来了解一下吧!laravel没有分场景表单验证概念,这点,倒比较喜欢thinkphp、yii等框架方式的,但可以实现,借助FormRequest类,创建一个基类BaseRequest来实现实现分场景方案,以下为应用总结。
1、创建带场景的表单请求验证基类
路径:app/Http/Requests/BaseRequest.php
namespace App\Http\Requests;use Illuminate\Foundation\Http\FormRequest;use Illuminate\Validation\ValidationException;/** * Class BaseRequest 带场景的表单请求验证基类 * @package App\Http\Requests */class BaseRequest extends FormRequest{ /** * 多场景设置 * @var array * 例: * $scenes = [ * 'store' => ['title','content'], * 'update' => ['id','title','content'], * 'destroy' => ['id'], * ] */ protected $scenes = []; /** * 注入表单请求验证时自动校验 * * @var bool */ public $autoValidate = false; /** * 当前场景 * @var string */ protected $currentScene = ''; /** * 用户是否拥有操作权限:true是,false否 * * @return bool */ public function authorize() { return true; } /** * 重置自动验证 * * @throws ValidationException * @throws \Illuminate\Auth\Access\AuthorizationException */ public function validateResolved() { if ($this->autoValidate) { $this->handleValidate(); } } /** * 获取场景验证规则 * @return array|mixed */ public function getRules() { $rules = $this->container->call([$this, 'rules']); $sceneRules = []; if ($this->currentScene && isset($this->scenes[$this->currentScene])) { $sceneFields = is_array($this->scenes[$this->currentScene]) ? $this->scenes[$this->currentScene] : explode(',', $this->scenes[$this->currentScene]); foreach ($sceneFields as $field) { if (array_key_exists($field, $rules)) { $sceneRules[$field] = $rules[$field]; } } return $sceneRules; } return $rules; } /** * 覆盖验证器 * @param $factory * @return mixed */ public function validator($factory) { return $factory->make( $this->validationData(), $this->getRules(), $this->messages(), $this->attributes() ); } /** * 应用时调用的验证方法 * @param string $scene * @return array|void * @throws \Illuminate\Auth\Access\AuthorizationException * @throws \Illuminate\Validation\ValidationException */ public function validate($scene = '') { if (!empty($scene)) { $this->currentScene = $scene; } $this->handleValidate(); } /** * 实际执行的验证方法 * @throws \Illuminate\Auth\Access\AuthorizationException * @throws \Illuminate\Validation\ValidationException */ protected function handleValidate() { $instance = $this->getValidatorInstance(); if ($instance->fails()) { $this->failedValidation($instance); } $this->passedValidation(); }}2、创建一个模型的验证类演示demo
路径:app/Http/Requests/DemoRequest.php
/** * Class DemoRequest 表单请求验证演示类 * @package App\Http\Requests */class DemoRequest extends BaseRequest{ /** * 注入表单请求验证时自动校验 * * @var bool */ public $autoValidate = false; /** * 用户是否有权操作,true是,false否 * * @return bool */ public function authorize() { return true; } /** * 字段验证规则 * * @return array */ public function rules() { return [ 'id' => 'required', 'title' => 'required|max:10', 'content' => 'required|max:255', ]; } /** * 提示信息 * * @return array */ public function messages() { return [ ]; } /** * 定义场景 * * @var \string[][] */ public $scenes = [ 'store' => ['title', 'content'], 'update' => ['id', 'title', 'content'], 'destroy' => ['id'], ]; /** * 验证错误的自定义属性 * * @return array */ public function attributes() { return [ 'id' => 'ID', 'title' => '标题', 'content' => '内容' ]; } /** * 验证前 * * @return void */ protected function prepareForValidation() { }}3、控制器中应用
// 1、分场景验证 // 需要DemoRequest中 设置 public $autoValidate = false;// 控制器中应用public function store(DemoRequest $request) { $request->validate('store'); }// 2、不分场景验证 // 需要DemoRequest中 设置 public $autoValidate = true; // 控制器中应用:注入时自动验证public function store(DemoRequest $request) { }
本文结束,希望对大家有所帮助,感谢关注。
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #php网络验证