如何優雅的使用 laravel 的 validator驗證方法

本文原創自news.mkq.online
版權聲明:本文爲原創文章,版權牛站新聞所有
轉載請註明http://www.niuzhan.com/Bago/
web 開發過程中經常會需要進行參數驗證,laravel 中我們常用 validator 或者 request 這兩種方法來進行驗證,但是這兩種驗證都不是很方便進行自定義提示信息,自定義驗證規則,所以下面來介紹一種很方便的用法:

新建抽象類
001
<?php
002

003
namespace App\Http\Validators;
004

005
use Validator;
006

007
abstract class AbstractValidator
008
{
009

010
/**
011

  • Validator
    012
  • 013

  • @var \Illuminate\Validation\Factory
    014
    */
    015
    protected $validator;
    016

017
/**
018

  • Validation data key => value array
    019
  • 020

  • @var array
    021
    */
    022
    protected $data = array();
    023

024
/**
025

  • Validation errors
    026
  • 027

  • @var array
    028
    */
    029
    protected $errors = array();
    030

031
/**
032

  • Validation rules
    033
  • 034

  • @var array
    035
    */
    036
    protected $rules = array();
    037

038
/**
039

  • Validation messages
    040
  • 041

  • @var array
    042
    */
    043
    protected $messages = array();
    044

045
/**
046

  • Validation codes
    047
  • 048

  • @var array
    049
    */
    050
    protected $codes = array();
    051

052
public function __construct(array $data)
053
{
054
$this->data = $data;
055
$this->before();
056
$this->validator = Validator::make($this->data, $this->rules, $this->messages);
057
$this->after();
058
}
059

060
/**
061

  • Set data to validate
    062
  • 063

  • @return validator
    064
    */
    065
    public function getValidator()
    066
    {
    067
    return $this->validator;
    068
    }
    069

070
/**
071

  • Set data to validate
    072
  • 073

  • @return $this
    074
    */
    075
    public function with(array $data)
    076
    {
    077
    $this->data = $data;
    078
    $this->before();
    079
    $this->validator = $this->validator->make($this->data, $this->rules, $this->messages);
    080
    $this->after();
    081
    return $this;
    082
    }
    083

084
/**
085

  • Validation passes or fails
    086
  • 087

  • @return boolean
    088
    */
    089
    public function passes()
    090
    {
    091
    if ($this->validator->fails()) {
    092
    $this->errors = $this->validator->messages();
    093

094
return false;
095
}
096

097
return true;
098
}
099

100
/**
101

  • Return errors, if any
    102
  • 103

  • @return array
    104
    */
    105
    public function errors()
    106
    {
    107
    return $this->errors;
    108
    }
    109

110
/**
111

  • Return errors codes, if any
    112
  • 113

  • @return array
    114
    */
    115
    public function getCodes()
    116
    {
    117
    return $this->codes;
    118
    }
    119

120
/**
121

  • getRules
    122
  • 123

  • @return array
    124
    */
    125
    public function getRules()
    126
    {
    127
    return $this->rules;
    128
    }
    129

130
/**
131

  • getData
    132
  • 133

  • @return array
    134
    */
    135
    public function getData()
    136
    {
    137
    return $this->data;
    138
    }
    139

140
/**
141

  • getErrors
    142
  • 143

  • @return array
    144
    */
    145
    public function getErrors()
    146
    {
    147
    return $this->errors;
    148
    }
    149

150
/**
151

  • getMessages
    152
  • 153

  • @return array
    154
    */
    155
    public function getMessages()
    156
    {
    157
    return $this->messages;
    158
    }
    159

160
/**
161

  • setRule
    162
  • 163

  • @param string $key
    164
  • @param string $value
    165
  • 166

  • @return $this
    167
    */
    168
    public function setRule($key, $value)
    169
    {
    170
    $this->rules[$key] = $value;
    171

172
return $this;
173
}
174

175
/**
176

  • emptyRules
    177
  • 178

  • @return $this
    179
    */
    180
    public function emptyRules()
    181
    {
    182
    $this->rules = array();
    183

184
return $this;
185
}
186

187
/**
188

  • sometimes
    189
  • 190

  • @param string $attribute
    191
  • @param string|array $rules
    192
  • @param callable $callback
    193
  • 194

  • @return $this
    195
    */
    196
    public function sometimes($attribute, $rules, callable $callback)
    197
    {
    198
    $this->validator->sometimes($attribute, $rules, $callback);
    199

200
return $this;
201
}
202

203
/**
204

  • resolver
    205
  • 206

  • @param Closure $resolver
    207
  • 208

  • @return $this
    209
    */
    210
    public function resolver(Closure $resolver)
    211
    {
    212
    Validator::resolver($resolver);
    213

214
return $this;
215
}
216

217
/**
218

  • replacer
    219
  • 220

  • @param Closure $resolver
    221
  • 222

  • @return $this
    223
    */
    224
    public function replacer($replace, Closure $resolver)
    225
    {
    226
    Validator::replacer($replace, $resolver);
    227

228
return $this;
229
}
230

231
/**
232

  • extendImplicit
    233
  • 234

  • @param Closure $resolver
    235
  • 236

  • @return $this
    237
    */
    238
    public function extendImplicit($extendImplicit, Closure $resolver)
    239
    {
    240
    Validator::extendImplicit($extendImplicit, $resolver);
    241

242
return $this;
243
}
244

245
/**
246

  • extend
    247
  • 248

  • @param string $rule
    249
  • @param \Closure|string $extension
    250
  • @param string $message
    251
  • 252

  • @return $this
    253
    */
    254
    public function extend($rule, $extension, $message = null)
    255
    {
    256
    Validator::extend($rule, $extension, $message);
    257

258
return $this;
259
}
260

261
/**
262

  • before (extend(),resolver())
    263
  • 264

  • @return $this
    265
    */
    266
    public function before()
    267
    {
    268
    }
    269

270
/**
271

  • after(sometimes())
    272
  • 273

  • @return $this
    274
    */
    275
    public function after()
    276
    {
    277
    }
    278
    }
    新建中間件
    01
    <?php
    02

03
namespace App\Http\Middleware;
04

05
use Closure;
06
use \Illuminate\Http\Request;
07

08
class ValidateAdminMiddleware
09
{
10
/**
11

  • This namespace is applied to the controller routes in your routes file.
    12
  • 13

  • In addition, it is set as the URL generator's root namespace.
    14
  • 15

  • @var string
    16
    */
    17
    protected $namespace = 'App\Http\Validators';
    18

19
/**
20

  • Handle an incoming request.
    21
  • 22

  • @param \Illuminate\Http\Request $request
    23
  • @param \Closure $next
    24
  • 25

  • @return mixed
    26
    */
    27
    public function handle(Request $request, Closure $next, $validator = null)
    28
    {
    29
    if ($request->isMethod('POST')) {
    30
    $type = $request->segment(1);
    31
    if ($validator) {
    32
    $validator = $this->namespace . '\' . studly_case($type) . '\' . studly_case($validator) . 'Validator';
    33
    $validator = new $validator($request->all());
    34

35
if (!$validator->passes()) {
36
if ($request->isAjax()) {
37
return $validator->errors()->first();
38
} else {
39
return redirect()->back()
40
->withErrors($validator->getValidator())
41
->withInput();
42
}
43
}
44
}
45
}
46
return $next($request);
47
}
48
}
新建 TestTestValidator
view sourceprint?
01
<?php
02

03
namespace App\Http\Validators\Admin;
04

05
use App\Http\Validators\AbstractValidator;
06

07
class TestValidator extends AbstractValidator
08
{
09
/**
10

  • Validation rules
    11
  • 12

  • @var Array
    13
    */
    14
    protected $rules = array(
    15
    'name' => ['required', 'test', 'min:1'],
    16
    );
    17

18
/**
19

  • Validation messages
    20
  • 21

  • @var Array
    22
    */
    23
    protected $messages = array(
    24
    'name.required' => '必填',
    25
    'name.min' => '最少1個字符',
    26
    'name.test' => '測試',
    27
    );
    28

29
/**
30

  • 自定義驗證規則或者擴展Validator類
    31
    */
    32
    public function before()
    33
    {
    34
    $this->extend('test', function ($attribute, $value, $parameters) {
    35
    return bool;
    36
    });
    37
    }
    38
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章