質問編集履歴

2

更新

2019/06/14 07:44

投稿

Chandler_Bing
Chandler_Bing

スコア673

test CHANGED
File without changes
test CHANGED
File without changes

1

更新

2019/06/14 07:44

投稿

Chandler_Bing
Chandler_Bing

スコア673

test CHANGED
File without changes
test CHANGED
@@ -1,17 +1,229 @@
1
+ お疲れ様です。先日のエラーですがミニプログラムを作成したので、添付します。
2
+
3
+
4
+
1
- 1番初めート
5
+ オリジナルバリデートを作成しているクラス
2
6
 
3
7
  ```php
4
8
 
9
+ <?php
10
+
11
+
12
+
13
+ namespace App\Providers;
14
+
15
+
16
+
17
+ use Illuminate\Support\ServiceProvider;
18
+
19
+ use Illuminate\Support\Facades\Validator;
20
+
21
+
22
+
23
+ class Test_ValidationServiceProvider extends ServiceProvider
24
+
25
+ {
26
+
27
+ /**
28
+
29
+ * Register services.
30
+
31
+ *
32
+
33
+ * @return void
34
+
35
+ */
36
+
37
+ public function register()
38
+
39
+ {
40
+
41
+ //
42
+
43
+ }
44
+
45
+
46
+
47
+ /**
48
+
49
+ * Bootstrap services.
50
+
51
+ *
52
+
53
+ * @return void
54
+
55
+ */
56
+
57
+ public function boot()
58
+
59
+ {
60
+
61
+
62
+
63
+ //特殊文字は許さない
64
+
65
+ /*以下の条件に一致しない(特殊文字が含まれている)ときにエラー処理を行う*/
66
+
67
+ Validator::extend('invalid', function ($attribute, $value, $parameters, $validator) {
68
+
5
- Route::get('/', 'BasicController@basic1');
69
+ $pattern = '-._~%:/?#[]@!$&\'()*+,;=';
70
+
6
-
71
+ $pattern = preg_quote($pattern, '/');
72
+
73
+ $pattern = "/[^" . $pattern . "]/";
74
+
75
+ return preg_match($pattern, $value);
76
+
77
+ });
78
+
79
+
80
+
81
+ //IDとパスワードはパスワードは英数字を含んだ16文字以下
82
+
83
+ Validator::extend('passid', function ($attribute, $value, $parameters, $validator) {
84
+
85
+ return preg_match("/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{5,16}+\z/i", $value);
86
+
87
+ });
88
+
89
+ }
90
+
91
+ }
92
+
7
- ```
93
+ ```
8
-
9
-
10
-
94
+
11
- 1番初めのルートに呼ばれるアクション
95
+ ルートです
12
96
 
13
97
  ```php
14
98
 
99
+ //テンプレであるコメントアウトは提示していません。
100
+
101
+ Route::get('/', 'TestController@basic1');
102
+
103
+ Route::post('/basic1', 'TestController@basic1Check');
104
+
105
+ Route::post('/basic2', 'TestController@basic2');
106
+
107
+ ```
108
+
109
+ オリジナルのバリデートをルールに追加しています
110
+
111
+ ```php
112
+
113
+ <?php
114
+
115
+ namespace App\Http\Requests;
116
+
117
+ use Illuminate\Foundation\Http\FormRequest;
118
+
119
+
120
+
121
+ class TestRequest extends FormRequest
122
+
123
+ {
124
+
125
+ /**
126
+
127
+ * Determine if the user is authorized to make this request.
128
+
129
+ *
130
+
131
+ * @return bool
132
+
133
+ */
134
+
135
+ public function authorize()
136
+
137
+ {
138
+
139
+ return true;
140
+
141
+ }
142
+
143
+
144
+
145
+ /**
146
+
147
+ * Get the validation rules that apply to the request.
148
+
149
+ *
150
+
151
+ * @return array
152
+
153
+ */
154
+
155
+ public function rules()
156
+
157
+ {
158
+
159
+ return [
160
+
161
+ 'name' => 'required|invalid|',
162
+
163
+ 'id' => 'passid',
164
+
165
+ 'pass' => 'passid|different:id',
166
+
167
+ ];
168
+
169
+ }
170
+
171
+
172
+
173
+ public function messages()
174
+
175
+ {
176
+
177
+ return [
178
+
179
+ //名前のバリデーション
180
+
181
+ 'name.required' => '名前の入力は必須です',
182
+
183
+ 'name.invalid' => '名前に使用できない文字が含まれています',
184
+
185
+ //idのバリデーション
186
+
187
+ 'id.passid' => 'ログインIDは英数字を含んだ16文字以下で入力してください',
188
+
189
+ //passのバリデーション
190
+
191
+ 'pass.passid' => 'パスワードは英数字を含んだ16文字以下で入力してください',
192
+
193
+ 'pass.different' => 'IDと同じパスワードは設定できません',
194
+
195
+ ];
196
+
197
+ }
198
+
199
+ }
200
+
201
+ ```
202
+
203
+ コントローラーです
204
+
205
+ ```php
206
+
207
+ <?php
208
+
209
+
210
+
211
+ namespace App\Http\Controllers;
212
+
213
+
214
+
215
+ use Illuminate\Http\Request;
216
+
217
+ use App\Http\Requests\TestRequest;
218
+
219
+
220
+
221
+ class TestController extends Controller
222
+
223
+ {
224
+
225
+ //一番初めに呼ばれます
226
+
15
227
  public function basic1()
16
228
 
17
229
  {
@@ -20,95 +232,205 @@
20
232
 
21
233
  'name' => null,
22
234
 
23
- 'kana' => null,
24
-
25
- 'name' => null,
26
-
27
- 'sex' => null,
28
-
29
- 'tel' => null,
30
-
31
- 'email' => null,
32
-
33
235
  'id' => null,
34
236
 
35
237
  'pass' => null,
36
238
 
37
239
  );
38
240
 
39
- return view('register.basic1')->with($hash);
241
+ return view('tests.test_basic1')->with($hash);
40
-
242
+
41
- }
243
+ }
42
-
43
- ```
244
+
44
-
45
-
46
-
47
- 表示先のビューで項目を入力し、ボタンを押しそれを受けるルート
48
-
49
- ```php
50
-
51
- Route::post('/basic1', 'BasicController@basic1Check');
245
+   //test_basic1から送信された値がバリデートを通過したあとの処理です
52
-
53
- ```
246
+
54
-
55
- そのルートに呼ばれるアクション(自作のバリデートクラスを使用)。
56
-
57
- 入力項目を操作し、次のページへ。
58
-
59
- ```php
60
-
61
- public function basic1Check(BasicRequest $request)
247
+ public function basic1Check(TestRequest $request)
62
248
 
63
249
  {
64
250
 
65
251
  $name = $request->name;
66
252
 
67
- $kana = $request->kana;
68
-
69
- $sex = $request->sex;
70
-
71
- $tel = $request->tel;
72
-
73
- $email = $request->email;
74
-
75
253
  $id = $request->id;
76
254
 
77
255
  $pass = $request->pass;
78
256
 
79
- //値を配列に格納します
257
+ //値を配列に格納し、分解します
80
-
258
+
81
- $basic1 = ['name' => $name, 'kana' => $kana, 'sex' => $sex, 'tel' => $tel, 'email' => $email, 'id' => $id, 'pass' => $pass];
259
+ $basic1 = ['name' => $name, 'id' => $id, 'pass' => $pass];
260
+
261
+ //この値がtest_basic2のbuttonタグのvalueに入ります
82
262
 
83
263
  $basic1Str = implode(',', $basic1);
84
264
 
85
- return view('register.basic2', ['basic1Str' => $basic1Str]);
265
+ return view('tests.test_basic2', ['basic1Str' => $basic1Str]);
86
-
266
+
87
- }
267
+ }
268
+
269
+
270
+
88
-
271
+ public function basic2(Request $request)
272
+
273
+ {
274
+
275
+ //このifでbackボタンが押されたかどうか判断していま
276
+
277
+ if (isset($request->basic1Str)) {
278
+
279
+ $basic1 = explode(',', $request->basic1Str);
280
+
281
+ $name = $basic1[0];
282
+
283
+ $id = $basic1[1];
284
+
285
+ $pass = $basic1[2];
286
+
287
+
288
+
289
+ $hash = array(
290
+
291
+ 'name' => $name,
292
+
293
+ 'id' => $id,
294
+
295
+ 'pass' => $pass,
296
+
297
+ );
298
+
299
+ return view('tests.test_basic1')->with($hash);
300
+
301
+ }
302
+
303
+ return view('tests.test_basic2');
304
+
305
+ }
306
+
307
+ }
308
+
89
- ```
309
+ ```
90
-
91
-
92
-
310
+
93
- このような流れです
311
+ 以下bladeです
312
+
94
-
313
+ ```blade
314
+
95
-
315
+ {{--一部抜粋です(test_basic1.php)--}}
316
+
317
+ <form method="post" action="/basic1">
318
+
319
+ {{ csrf_field() }}
320
+
321
+ <p>ナマエ</p>
322
+
323
+ <input type="text" name="name" value="{{ old('name', $name) }}">
324
+
325
+ @if ($errors->has('name'))
326
+
327
+ <span class="errormsg">{{ $errors->first('name') }}</span>
328
+
329
+ @endif
330
+
331
+
332
+
333
+
334
+
335
+ <p>ログインID</p>
336
+
337
+ <input type="text" name="id" value="{{ old('id', $id) }}">
338
+
339
+ @if ($errors->has('id'))
340
+
341
+ <span class="errormsg">{{ $errors->first('id') }}</span>
342
+
343
+ @endif
344
+
345
+
346
+
347
+
348
+
349
+ <p>パスワード</p>
350
+
351
+ <input type="text" name="pass" value="{{ old('pass', $pass) }}">
352
+
353
+ @if ($errors->has('pass'))
354
+
355
+ <span class="errormsg">{{ $errors->first('pass') }}</span>
356
+
357
+ @endif
358
+
359
+
360
+
361
+ <button type="submit" class="btn btn-primary mb-5">Next</button>
362
+
363
+ </form>
364
+
365
+ ```
366
+
367
+
368
+
369
+ ```blade
370
+
371
+ {{--一部抜粋です(test_basic2.php)--}}
372
+
373
+ <form method="post" action="/basic2">
374
+
375
+ {{ csrf_field() }}
376
+
377
+
378
+
379
+ <select id="inputReason" class="custom-select">
380
+
381
+ <option selected>Open this select menu</option>
382
+
383
+ <option value="1">One</option>
384
+
385
+ <option value="2">Two</option>
386
+
387
+ <option value="3">Three</option>
388
+
389
+ </select>
390
+
391
+ <button type="submit">Next</button>
392
+
393
+ <button type="submit" name="basic1Str" value="{{ $basic1Str }}">back</button>
394
+
395
+ </form>
396
+
397
+ ```
96
398
 
97
399
  **問題**
98
400
 
99
- コード非常に長いので、全て載せることが出来ないのですが、2ページ目で戻るボタンを押し1ページ目に遷移するときちんと入力した値が保持されています。
100
-
101
-
102
-
103
- また値を変更し2ページ目に遷移し、再び1ページ目に遷移しても、きちんと直近の値がvalueに残っています。
104
-
105
-
106
-
107
- 問題は2ページ目から1ページ目戻り、エラー値入力した場合のみ以下のエラーが出ます。
401
+ ①一番初めurlに'/'のurl打つ
402
+
403
+
404
+
108
-
405
+ ②test_basic1.blade.php表示
406
+
407
+
408
+
409
+
410
+
109
- 1番初めに1ペジ目にきて、エラー値を入力すると、きちんと自作クラスでたエラーメッセージが
411
+ test_basic1.balde.phpでバリデトを通過する値を入力(通過しない値でもきちんと画面に設たエラーメッセージがでる。)
412
+
413
+
414
+
110
-
415
+ ④通過するとtest_basic2.blade.phpを表示(backボタンのvalueにはtest_basic1で入力した値がきちんと入っていることは確認済みです)
416
+
417
+
418
+
111
- 画面に表示されま
419
+ ⑤backボタンを押
420
+
421
+
422
+
423
+ ⑥test_basic1.blade.phpが表示され、先ほど入力した値がすでに入力済み(期待値)
424
+
425
+
426
+
427
+ ⑦-1
428
+
429
+ バリデート通過する値を入力すると問題なくtest_basic2.blade.phpが表示される
430
+
431
+ ⑦-2
432
+
433
+ バリデート通過しない値を入力すると以下のエラーが表示される
112
434
 
113
435
  ```error
114
436
 
@@ -116,342 +438,12 @@
116
438
 
117
439
  ```
118
440
 
119
- 1回目と遷移後のバリデーションチェックの飛び先が違うのでしょうか。
120
-
121
- ため
122
-
123
- basic1.blade.phpとbasic2.blade.phpを貼っておきます
124
-
125
- ```php
126
-
127
- @extends('layouts.layout')
128
-
129
-
130
-
131
- @section('title', 'basic1')
132
-
133
-
134
-
135
- @section('content')
136
-
137
-
138
-
139
-
140
-
141
- <form method="post" action="/basic1">
142
-
143
-
144
-
145
- {{ csrf_field() }}
146
-
147
-
148
-
149
- <div class="form-group my-5">
150
-
151
- <label for="formGroupExampleInput" class="font-weight-bold">名前</label>
152
-
153
- <input type="text" name="name" class="form-control" id="formGroupExampleInput" placeholder="名前をスペースなしで入力してください"
154
-
155
- maxlength="64" value="{{ old('name', $name) }}">
156
-
157
- @if ($errors->has('name'))
158
-
159
- <span class="errormsg">{{ $errors->first('name') }}</span>
160
-
161
- @endif
162
-
163
- </div>
164
-
165
-
166
-
167
- <div class="form-group mb-5">
168
-
169
- <label for="formGroupExampleInput" class="font-weight-bold">ナマエ</label>
170
-
171
- <input type="text" name="kana" class="form-control" id="formGroupExampleInput" placeholder="ナマエをスペースなしで入力してください"
172
-
173
- maxlength="64" value="{{ old('kana', $kana) }}">
174
-
175
- @if ($errors->has('kana'))
176
-
177
- <span class="errormsg">{{ $errors->first('kana') }}</span>
178
-
179
- @endif
180
-
181
- </div>
182
-
183
-
184
-
185
- <p class="font-weight-bold h6">性別</p>
186
-
187
- <div class="custom-control custom-radio custom-control-inline mb-5">
188
-
189
- <input type="radio" id="customRadioInline1" name="sex" class="custom-control-input" value="male" @if (old('sex',
190
-
191
- $sex)=="male" ) checked @endif>
192
-
193
- <label class="custom-control-label font-weight-bold" for="customRadioInline1">男性</label>
194
-
195
- </div>
196
-
197
- <div class="custom-control custom-radio custom-control-inline">
198
-
199
- <input type="radio" id="customRadioInline2" name="sex" class="custom-control-input" value="female"
200
-
201
- @if(old('sex', $sex)=="female" ) checked @endif>
202
-
203
- <label class="custom-control-label font-weight-bold" for="customRadioInline2">女性</label>
204
-
205
- </div>
206
-
207
- @if ($errors->has('sex'))
208
-
209
- <span class="errormsg">{{ $errors->first('sex') }}</span>
210
-
211
- @endif
212
-
213
-
214
-
215
- <div class="form-group mb-5">
216
-
217
- <label for="formGroupExampleInput" class="font-weight-bold">電話番号</label>
218
-
219
- <input type="tel" name="tel" class="form-control" id="formGroupExampleInput" placeholder="電話番号をハイフンなしで入力してください"
220
-
221
- value="{{ old('tel', $tel) }}">
222
-
223
- @if ($errors->has('tel'))
224
-
225
- <span class="errormsg">{{ $errors->first('tel') }}</span>
226
-
227
- @endif
228
-
229
- </div>
230
-
231
-
232
-
233
- <div class="form-group mb-5">
234
-
235
- <label for="formGroupExampleInput" class="font-weight-bold">メールアドレス(任意)</label>
236
-
237
- <input type="text" name="email" class="form-control" id="formGroupExampleInput" placeholder="メールアドレスを入力してください"
238
-
239
- value="{{ old('email', $email) }}">
240
-
241
- @if ($errors->has('email'))
242
-
243
- <span class="errormsg">{{ $errors->first('email') }}</span>
244
-
245
- @endif
246
-
247
- </div>
248
-
249
-
250
-
251
- <div class="form-group mb-5">
252
-
253
- <label for="formGroupExampleInput" class="font-weight-bold">ログインID</label>
254
-
255
- <input type="text" name="id" class="form-control" id="formGroupExampleInput"
256
-
257
- placeholder="ログインIDは英数字を含んだ16文字以下で入力してください" maxlength="16" value="{{ old('id', $id) }}">
258
-
259
- @if ($errors->has('id'))
260
-
261
- <span class="errormsg">{{ $errors->first('id') }}</span>
262
-
263
- @endif
264
-
265
- </div>
266
-
267
-
268
-
269
- <div class="form-group mb-5">
270
-
271
- <label for="formGroupExampleInput" class="font-weight-bold">パスワード</label>
272
-
273
- <input type="text" name="pass" class="form-control" id="formGroupExampleInput"
274
-
275
- placeholder="パスワードは英数字を含んだ16文字以下で入力してください" maxlength="16">
276
-
277
- @if ($errors->has('pass'))
278
-
279
- <span class="errormsg">{{ $errors->first('pass') }}</span>
280
-
281
- @endif
282
-
283
- </div>
284
-
285
-
286
-
287
- <button type="submit" class="btn btn-primary mb-5">Next</button>
288
-
289
-
290
-
291
- </form>
292
-
293
- @endsection
294
-
295
- ```
296
-
297
-
298
-
299
- ```php
300
-
301
- @extends('layouts.layout')
302
-
303
-
304
-
305
- @section('title', 'basic2')
306
-
307
-
308
-
309
- @section('content')
310
-
311
-
312
-
313
- <form action="/basic2" method="post">
314
-
315
-
316
-
317
- {{ csrf_field() }}
318
-
319
-
320
-
321
- <div class="form-row mt-5">
322
-
323
- <div class="form-group col-md-6">
324
-
325
- <label for="inputZip" class="font-weight-bold">郵便番号</label>
326
-
327
- <input id="inputZip" class="form-control" type="text">
328
-
329
- </div>
330
-
331
- <div class="form-group col-md-6">
332
-
333
- <label for="inputState" class="font-weight-bold">都道府県</label>
334
-
335
- <select id="inputState" class="form-control">
336
-
337
- <option selected>Choose...</option>
338
-
339
- <option>...</option>
340
-
341
- </select>
342
-
343
- </div>
344
-
345
- </div>
346
-
347
-
348
-
349
- <div class="form-group my-5">
350
-
351
- <label for="inputAddress" class="font-weight-bold">以降の住所</label>
352
-
353
- <input id="inputAddress" class="form-control" type="text" placeholder="1234 Main St">
354
-
355
- </div>
356
-
357
-
358
-
359
- <div class="form-group mb-5">
360
-
361
- <label for="inputReason" class="font-weight-bold">知ったきっかけ</label>
362
-
363
- <select id="inputReason" class="custom-select">
364
-
365
- <option selected>Open this select menu</option>
366
-
367
- <option value="1">One</option>
368
-
369
- <option value="2">Two</option>
370
-
371
- <option value="3">Three</option>
372
-
373
- </select>
374
-
375
- </div>
376
-
377
-
378
-
379
- <div class="form-group mb-5">
380
-
381
- <label for="inputReason" class="font-weight-bold">目的</label>
382
-
383
- <select id="inputReason" class="custom-select">
384
-
385
- <option selected>Open this select menu</option>
386
-
387
- <option value="1">One</option>
388
-
389
- <option value="2">Two</option>
390
-
391
- <option value="3">Three</option>
392
-
393
- </select>
394
-
395
- </div>
396
-
397
-
398
-
399
- <p class="font-weight-bold h6">TOEIC</p>
400
-
401
- <div class="form-group mb-5">
402
-
403
- <div class="custom-control custom-switch custom-control-inline">
404
-
405
- <input id="customSwitch1" class="custom-control-input" type="radio" name="toeic" value="have">
406
-
407
- <label class="custom-control-label font-weight-bold" for="customSwitch1">受験経験あり</label>
408
-
409
- </div>
410
-
411
- <div class="custom-control custom-switch custom-control-inline">
412
-
413
- <input id="customSwitch2" class="custom-control-input" type="radio" name="toeic" value="have_not" checked>
414
-
415
- <label class="custom-control-label font-weight-bold" for="customSwitch2">受験経験なし</label>
416
-
417
- </div>
418
-
419
- </div>
420
-
421
-
422
-
423
- <div class="form-group mb-5">
424
-
425
- <label for="inputResult" class="font-weight-bold">点数</label>
426
-
427
- <input id="inputResult" class="form-control score" type="text" name="score" value="" placeholder="点数を入力してください">
428
-
429
- </div>
430
-
431
-
432
-
433
- <div class="form-group mb-5">
434
-
435
- <button type="submit" class="btn btn-primary mr-5">Next</button>
436
-
437
- <button type="submit" class="btn btn-secondary" id="" name="basic1Str" value="{{ $basic1Str }}">back</button>
438
-
439
- </div>
440
-
441
-
442
-
443
- </form>
444
-
445
- @endsection
446
-
447
-
448
-
449
- @section('script')
450
-
451
- <script src="/js/main.js"></script>
452
-
453
- @endsection
454
-
455
-
456
-
457
- ```
441
+
442
+
443
+ 一番初めにtest_basic1.blade.phpでバリデートエラーを出してもtest_basic2.blade.phpからtest_basic1.blade.phpに戻ってきてバリデートエラーを出しても動きは同じだと思うですが、何が問題でしょうか。
444
+
445
+
446
+
447
+ またバリデートクラスの作成は以下のサイトの方法と全く同じです。
448
+
449
+ [Laravelのカスタムバリデーション](https://minory.org/laravel-custom-validation-rule.html)