質問編集履歴

5

コントローラーを調整

2020/01/14 18:21

投稿

kamille-mio
kamille-mio

スコア24

test CHANGED
File without changes
test CHANGED
@@ -236,7 +236,7 @@
236
236
 
237
237
 
238
238
 
239
- #### Controller(自try-catchを組んでみまし、全体としては未完成なので抜粋してます)
239
+ #### Controller(自予約確定まで組んでみたのです)
240
240
 
241
241
  ```php
242
242
 
@@ -244,24 +244,6 @@
244
244
 
245
245
 
246
246
 
247
- namespace App\Http\Controllers;
248
-
249
-
250
-
251
- use App\Reserve;
252
-
253
- use App\Exceptions\ReserveDuplicationException;
254
-
255
- use App\Http\Requests\CreateReserveRequest;
256
-
257
- use Carbon\Carbon;
258
-
259
- use Illuminate\Http\Request;
260
-
261
-
262
-
263
-
264
-
265
247
  class ReserveController extends Controller {
266
248
 
267
249
 
@@ -412,7 +394,7 @@
412
394
 
413
395
  }
414
396
 
415
- // try-catchで例外が出たら処理中止する。
397
+ // try-catchで例外が出たら入力フォームまでロールバックする。
416
398
 
417
399
 
418
400
 
@@ -444,7 +426,7 @@
444
426
 
445
427
 
446
428
 
447
- // 入力確認ページのviewにinputsを渡す
429
+ // 入力確認ページのviewにdataを渡す
448
430
 
449
431
  return view('reserve-confirm', [
450
432
 
@@ -470,220 +452,244 @@
470
452
 
471
453
 
472
454
 
455
+ // 予約完了メールの発送
456
+
457
+ public function send(Request $request) {
458
+
459
+
460
+
461
+ //フォームから受け取ったactionの値を取得
462
+
463
+ $action = $request->input('action');
464
+
465
+ $inputs = $request->except('action');
466
+
467
+
468
+
469
+ //actionの値で分岐
470
+
471
+ if($action !== 'submit'){
472
+
473
+ return redirect()
474
+
475
+ ->route('reserve.index')
476
+
477
+ ->withInput($inputs);
478
+
479
+
480
+
481
+ } else {
482
+
483
+ $user = Auth::user();
484
+
485
+ $email = $user->email;
486
+
487
+ \Mail::to($email)->send(new ContactSendmail($inputs));
488
+
489
+
490
+
491
+ // トークンを再発行して再送信防止
492
+
493
+
494
+
495
+ $request->session()->regenerateToken();
496
+
497
+
498
+
499
+ }
500
+
501
+
502
+
503
+ }
504
+
505
+
506
+
507
+
508
+
509
+ // 予約確定による、データベースへの情報の追加
510
+
511
+
512
+
513
+ public function store(Request $request) {
514
+
515
+
516
+
517
+ // バリデーション
518
+
519
+
520
+
521
+ $request->validate([
522
+
523
+ 'facility_name' => 'required',
524
+
525
+ 'dateinfo' => 'required',
526
+
527
+ 'start_time' => 'required',
528
+
529
+ 'end_time' => 'required',
530
+
531
+ ]);
532
+
533
+
534
+
535
+
536
+
537
+ // 再度ダブルブッキングのチェックを行う。
538
+
539
+ $this->confirm($request);
540
+
541
+
542
+
543
+ // 以下、ダブルブッキングなしの場合の更新処理
544
+
545
+
546
+
547
+ //フォームから受け取ったactionを除いたinputの値を取得
548
+
549
+ $inputs = $request->except('action');
550
+
551
+
552
+
553
+ // 検索用にfacility_nameをのみ別に変数に取り出しておく
554
+
555
+
556
+
557
+ $facility_name = $inputs['facility_name'];
558
+
559
+
560
+
561
+ // facility_idを抽出するメソッド
562
+
563
+
564
+
565
+ $facility_id = Facility::SearchFacility_id($facility_name);
566
+
567
+
568
+
569
+
570
+
571
+ // dateinfoとstart_time及びend_timeを組み合わせてdatetime型にする。
572
+
573
+ $start_time =$inputs['dateinfo'] .' '. $inputs['start_time'];
574
+
575
+ $end_time =$inputs['dateinfo'] .' '. $inputs['end_time'];
576
+
577
+
578
+
579
+ // 予約番号生成
580
+
581
+
582
+
583
+ $reserve_number = uniqid(bin2hex(random_bytes((1))));
584
+
585
+
586
+
587
+ // ユーザー情報取得
588
+
589
+ $user = Auth::user();
590
+
591
+ $user_id = $user->id;
592
+
593
+
594
+
595
+ // データベースに追加
596
+
597
+ $reserve = new Reserve();
598
+
599
+ $reserve->user_id = $user_id;
600
+
601
+ $reserve->facility_id = $facility_id;
602
+
603
+ $reserve->start_time = $start_time;
604
+
605
+ $reserve->end_time = $end_time;
606
+
607
+ $reserve->reserve_number = $reserve_number;
608
+
609
+ $reserve->save();
610
+
611
+
612
+
613
+ \Debugbar::info();
614
+
615
+
616
+
617
+ $this->send($request);
618
+
619
+
620
+
621
+ // viewへ遷移
622
+
623
+ return view('reserve-complete' ,[
624
+
625
+ 'reserve_number' => $reserve_number,
626
+
627
+ ]);
628
+
629
+ }
630
+
631
+
632
+
473
633
  ```
474
634
 
475
635
 
476
636
 
637
+
638
+
639
+
640
+
641
+ ## 質問に際してやったこと・作ったもの
642
+
643
+
644
+
477
- #### View(formの部分だけ抜粋)
645
+ ####console.log一覧
646
+
647
+ ![イメージ説明](bf9d85eeb4899a2eb321994921a1f7d8.png)
648
+
649
+
650
+
651
+ ####定義しているテーブル
652
+
653
+ ![イメージ説明](3ea1e3d5e942984d320f517afee539f5.png)
654
+
655
+
656
+
657
+ ## 追記
658
+
659
+
660
+
661
+ ####Handler.php
662
+
663
+
478
664
 
479
665
  ```php
480
666
 
481
667
 
482
668
 
483
- <form method="POST" id="test">
484
-
485
- @csrf
486
-
487
- <div class="form-group row">
488
-
489
- <label for="facility_name" class="col-md-4 col-form-label text-md-right">{{ __('facility_name' )}}</label>
490
-
491
-
492
-
493
- <div class="col-md-6">
494
-
495
- <select class="form-control" id="facility_name" name="facility_name">
496
-
497
- <option value="blank" selected="selected">選択してください</option>
498
-
499
- <option value="test1">test1</option>
500
-
501
- <option value="test2">test2</option>
502
-
503
- <option value="test3">test4</option>
504
-
505
- </select>
506
-
507
-
508
-
509
- </div>
510
-
511
- </div>
512
-
513
-
514
-
515
- <div class="form-group row">
516
-
517
- <label for="dates" class="col-md-4 col-form-label text-md-right">{{ __('dates' )}}</label>
518
-
519
-
520
-
521
- <div class="col-md-6">
522
-
523
- <input type="text" class="form-control dateinfo" placeholder="Select Date.." id="dateinfo" name="dateinfo" readonly="readonly">
524
-
525
-
526
-
527
- </div>
528
-
529
- </div>
530
-
531
-
532
-
533
- <div class="form-group row">
534
-
535
- <div class="col-md-8 offset-md-4">
536
-
537
- <button type="submit" class="btn btn-primary" data-action='javascript:void(0);' id="date-select">
538
-
539
- {{ __('submit') }}
540
-
541
- </button>
542
-
543
-
544
-
545
- </div>
546
-
547
- </div>
548
-
549
-
550
-
551
- <div class="form-group row js-timeselectform" >
552
-
553
- <label for="start_time" class="col-md-4 col-form-label text-md-right">{{ __('start_time' )}}</label>
554
-
555
-
556
-
557
- <div class="col-md-6">
558
-
559
- <input type="text" class="form-control time" placeholder="Select Time.." id="start_time" name="start_time" readonly="readonly">
560
-
561
-
562
-
563
- </div>
564
-
565
- </div>
566
-
567
-
568
-
569
- <div class="form-group row js-timeselectform">
570
-
571
- <label for="end_time" class="col-md-4 col-form-label text-md-right">{{ __('end_time' )}}</label>
572
-
573
-
574
-
575
- <div class="col-md-6">
576
-
577
- <input type="text" class="form-control time" placeholder="Select Time.." id="end_time" name="end_time" readonly="readonly">
578
-
579
-
580
-
581
- </div>
582
-
583
- </div>
584
-
585
-
586
-
587
- <div class="form-group row js-timeselectform">
588
-
589
- <div class="col-md-8 offset-md-4">
590
-
591
- <button type="submit" class="btn btn-primary" data-action="{{ route('reserve.confirm') }}" id="reserve-settle">
592
-
593
- {{ __('reserve-settle') }}
594
-
595
- </button>
596
-
597
- </div>
598
-
599
- </div>
600
-
601
- </form>
602
-
603
- </div>
604
-
605
- </div>
606
-
607
- <!-- 予約時間重複によるエラーメッセージ表示。仮置してます。 -->
608
-
609
- @if ($errors->any())
610
-
611
- <ul id = "error" class="error">
612
-
613
- @foreach ($errors->all() as $error)
614
-
615
-
616
-
617
- <li>{{ $error }}</li>
618
-
619
-
620
-
621
- @endforeach
622
-
623
- </ul>
624
-
625
- @endif
626
-
627
-
628
-
629
- (後略)
669
+ public function prepareResponse($request, Exception $e) {
670
+
671
+ // 競合違反を条件分岐
672
+
673
+ if($e instanceof ConflictHttpException) {
674
+
675
+ return $this->invaildHttpRequest($request, $e);
676
+
677
+ }
678
+
679
+ // 予約時間が競合していた場合エラーハンドリング
680
+
681
+ if($e instanceof ReserveDuplicationException) {
682
+
683
+ return redirect()->back()->withInput()->withErrors('その時間帯はすでに予約が入っています');
684
+
685
+ }
686
+
687
+
688
+
689
+ return parent::prepareResponse($request, $e);
690
+
691
+ }
692
+
693
+
630
694
 
631
695
  ```
632
-
633
-
634
-
635
- ## 質問に際してやったこと・作ったもの
636
-
637
-
638
-
639
- ####console.log一覧
640
-
641
- ![イメージ説明](bf9d85eeb4899a2eb321994921a1f7d8.png)
642
-
643
-
644
-
645
- ####定義しているテーブル
646
-
647
- ![イメージ説明](3ea1e3d5e942984d320f517afee539f5.png)
648
-
649
-
650
-
651
- ## 追記
652
-
653
-
654
-
655
- ####Handler.php
656
-
657
-
658
-
659
- ```php
660
-
661
-
662
-
663
- public function prepareResponse($request, Exception $e) {
664
-
665
- // 競合違反を条件分岐
666
-
667
- if($e instanceof ConflictHttpException) {
668
-
669
- return $this->invaildHttpRequest($request, $e);
670
-
671
- }
672
-
673
- // 予約時間が競合していた場合エラーハンドリング
674
-
675
- if($e instanceof ReserveDuplicationException) {
676
-
677
- return redirect()->back()->withInput()->withErrors('その時間帯はすでに予約が入っています');
678
-
679
- }
680
-
681
-
682
-
683
- return parent::prepareResponse($request, $e);
684
-
685
- }
686
-
687
-
688
-
689
- ```

4

ControllerとViewの更新とHandler.phpの追記

2020/01/14 18:21

投稿

kamille-mio
kamille-mio

スコア24

test CHANGED
File without changes
test CHANGED
@@ -44,11 +44,15 @@
44
44
 
45
45
  このようなコードを書いて冒頭の画像の利用開始時刻と、利用終了時刻の選択内容をバインドしています。
46
46
 
47
- ですが、すでにおわかりかもしれませんが、私が未熟なので例えばこの場合利用開始に14:00、利用終了に18:00を選択して14:00~18:00の時間帯を予約したいというリクエストができてしまいます。
47
+ ですが、例えばこの場合利用開始に14:00、利用終了に18:00を選択して14:00~18:00の時間帯を予約したいというリクエストができてしまいます。
48
48
 
49
49
  当然それでは前述の前提条件とバッティングしてしまうのでその場合、確認画面に遷移せずフォームにリダイレクトしてエラーメッセージを表示させたいのですがこの場合バリデーションでやるのか自分で独自例外を作成してtry-catchでその例外に投げるのかどちらにするのかがわからないのでお聞きしたいです。
50
50
 
51
+
52
+
53
+ 2020/01/10
54
+
51
- 本来なら無効な値ということでバリデーションでどうにするのか? という考えはあるのですが、上記の例の場合それぞれ利用開始・利用終了単独の値としては有効なので詰まってしまいました.......
55
+ コメト欄ご指摘いただいた箇所を修正、つ自分りにエラーハンドリングをしてみたのでControllerにそれを反映。
52
56
 
53
57
 
54
58
 
@@ -98,7 +102,7 @@
98
102
 
99
103
  #### バリデーション
100
104
 
101
- とりあえず基本的なところだけです
105
+ とりあえず基本的なところだけ。rulesメソッドのみ抜粋。
102
106
 
103
107
 
104
108
 
@@ -122,53 +126,181 @@
122
126
 
123
127
  {
124
128
 
125
- /**
129
+
126
-
127
- * Determine if the user is authorized to make this request.
130
+
128
-
129
- *
130
-
131
- * @return bool
132
-
133
- */
134
-
135
- public function authorize() {
131
+ public function rules()
136
-
137
-
138
-
132
+
139
- // 認証関係のバリデーションはここ。なければtrueを返す。
133
+ {
140
-
134
+
141
- return true;
135
+ return [
136
+
137
+ 'facility_name' => 'not_in:0',
138
+
139
+ 'dateinfo' => 'required|date',
140
+
141
+ 'start_time' => 'required|date_format:H:i',
142
+
143
+ 'end_time' => 'required|date_format:H:i',
144
+
145
+ ];
142
146
 
143
147
  }
144
148
 
145
-
146
-
147
- /**
148
-
149
- * Get the validation rules that apply to the request.
150
-
151
- *
152
-
153
- * @return array
154
-
155
- */
156
-
157
- public function rules()
158
-
159
- {
160
-
161
- return [
162
-
163
- 'facility_name' => 'not_in:0',
164
-
165
- 'dateinfo' => 'required|date',
166
-
167
- 'start_time' => 'required|date_format:H:i',
168
-
169
- 'end_time' => 'required|date_format:H:i',
170
-
171
- ];
149
+ }
150
+
151
+
152
+
153
+
154
+
155
+ ```
156
+
157
+
158
+
159
+ #### model
160
+
161
+ ```php
162
+
163
+ <?php
164
+
165
+
166
+
167
+ namespace App;
168
+
169
+
170
+
171
+ use Illuminate\Database\Eloquent\Model;
172
+
173
+
174
+
175
+ class Reserve extends Model {
176
+
177
+ public $incrementing = false;
178
+
179
+
180
+
181
+ protected $fillable = [
182
+
183
+ 'user_id',
184
+
185
+ 'facility_id',
186
+
187
+ 'start_time',
188
+
189
+ 'end_time',
190
+
191
+
192
+
193
+ ];
194
+
195
+
196
+
197
+ public function user() {
198
+
199
+ return $this->belongsTo('App\User');
200
+
201
+ }
202
+
203
+
204
+
205
+ public function facility() {
206
+
207
+ return $this->belongsTo('App\Facility');
208
+
209
+ }
210
+
211
+
212
+
213
+ static function SearchReserveDates($facility_name, $dateinfo) {
214
+
215
+
216
+
217
+ $result = \App\Reserve::whereHas('Facility', function($query) use($facility_name, $dateinfo) {
218
+
219
+ $query
220
+
221
+ ->where('facility_name',$facility_name)
222
+
223
+ ->whereDate('start_time',$dateinfo)
224
+
225
+ ->whereDate('end_time',$dateinfo);
226
+
227
+ })->select('id', 'start_time', 'end_time')->get()->all();
228
+
229
+ return $result;
230
+
231
+ }
232
+
233
+ }
234
+
235
+ ```
236
+
237
+
238
+
239
+ #### Controller(自分でtry-catchを組んでみました、全体としては未完成なので抜粋してます)
240
+
241
+ ```php
242
+
243
+ <?php
244
+
245
+
246
+
247
+ namespace App\Http\Controllers;
248
+
249
+
250
+
251
+ use App\Reserve;
252
+
253
+ use App\Exceptions\ReserveDuplicationException;
254
+
255
+ use App\Http\Requests\CreateReserveRequest;
256
+
257
+ use Carbon\Carbon;
258
+
259
+ use Illuminate\Http\Request;
260
+
261
+
262
+
263
+
264
+
265
+ class ReserveController extends Controller {
266
+
267
+
268
+
269
+ // フォームから受け取った情報をもとにテーブルを検索、施設名から施設IDを引っ張り、日付と合わせて予約情報を取得しAjaxに返す。
270
+
271
+ public function searchReservation(Request $request) {
272
+
273
+
274
+
275
+ $data = $request->all();
276
+
277
+
278
+
279
+ if(isset($data['dateinfo']) && isset($data['facility_name'])) {
280
+
281
+
282
+
283
+ $dateinfo = $data['dateinfo'];
284
+
285
+ $facility_name = $data['facility_name'];
286
+
287
+
288
+
289
+ $reserveinfo = Reserve::SearchReserveDates($facility_name, $dateinfo);
290
+
291
+
292
+
293
+ \Debugbar::info();
294
+
295
+
296
+
297
+ return json_encode($reserveinfo, JSON_PRETTY_PRINT);
298
+
299
+
300
+
301
+ } else {
302
+
303
+ echo 'FAIL TO AJAX REQUEST';
172
304
 
173
305
  }
174
306
 
@@ -176,492 +308,382 @@
176
308
 
177
309
 
178
310
 
311
+ // 入力確認画面に最終的なフォームの値を渡す。Requestにはバリデーションの拡張クラスを渡す。
312
+
313
+ public function confirm(CreateReserveRequest $request) {
314
+
315
+
316
+
317
+ // 予約情報取得
318
+
319
+
320
+
321
+ $data = $request->all();
322
+
323
+
324
+
325
+ if(isset($data['dateinfo']) && isset($data['facility_name'])) {
326
+
327
+
328
+
329
+ $dateinfo = $data['dateinfo'];
330
+
331
+ $facility_name = $data['facility_name'];
332
+
333
+
334
+
335
+ $reserveinfo = Reserve::SearchReserveDates($facility_name, $dateinfo);
336
+
337
+ }
338
+
339
+
340
+
341
+
342
+
343
+ // 取得したレコードを配列の形にする。
344
+
345
+ // start_timeとend_timeそれぞれの値で配列を作る。
346
+
347
+
348
+
349
+ $arr_start_time = array_column($reserveinfo, 'start_time');
350
+
351
+ // var_dump($arr_start_time);
352
+
353
+ $arr_end_time = array_column($reserveinfo, 'end_time');
354
+
355
+ // var_dump($arr_end_time);
356
+
357
+
358
+
359
+ // 選択された時間帯が予約時間と重複していないか検証
360
+
361
+ if(isset($data['start_time']) && isset($data['end_time'])) {
362
+
363
+
364
+
365
+ // datetime型に整形
366
+
367
+ $start_datetime =$data['dateinfo'] .' '. $data['start_time'];
368
+
369
+ $end_datetime =$data['dateinfo'] .' '. $data['end_time'];
370
+
371
+
372
+
373
+ // Carbonに整形
374
+
375
+
376
+
377
+ $st = new Carbon($start_datetime);
378
+
379
+ $start = $st->format('Y-m-d H:i:s');
380
+
381
+ // var_dump($start);
382
+
383
+ $ed = new Carbon($end_datetime);
384
+
385
+ $end = $ed->format('Y-m-d H:i:s');
386
+
387
+ // var_dump($end);
388
+
389
+ // テーブルから予約情報取得して配列に格納
390
+
391
+ // それぞれ$arr_start_time[]と$arr_end_times[]で呼び出せるようにする
392
+
393
+ // forかwhile文で$start_time[n]と$end_time[n]まで検証する
394
+
395
+
396
+
397
+ // $arr_start_time及び$arr_end_timeの配列の数を取得する。
398
+
399
+ $c1 = count($arr_start_time);
400
+
401
+ $c2 = count($arr_end_time);
402
+
403
+
404
+
405
+
406
+
407
+ // 時間帯比較の関数
408
+
409
+ function isTimeDuplication($start, $end, $start_time, $end_time) {
410
+
411
+ return ($start < $end_time && $start_time < $end);
412
+
413
+ }
414
+
415
+ // try-catchで例外が出たら処理中止する。
416
+
417
+
418
+
419
+ try {
420
+
421
+
422
+
423
+ for ($i=0; $i < $c1 && $c2 ; $i++) {
424
+
425
+
426
+
427
+ $start_time = $arr_start_time[$i];
428
+
429
+ $end_time = $arr_end_time[$i];
430
+
431
+
432
+
433
+ $result = isTimeDuplication($start, $end, $start_time, $end_time);
434
+
435
+
436
+
437
+ if($result === TRUE) {
438
+
439
+ throw new ReserveDuplicationException;
440
+
441
+ }
442
+
443
+ }
444
+
445
+
446
+
447
+ // 入力確認ページのviewにinputsを渡す
448
+
449
+ return view('reserve-confirm', [
450
+
451
+ 'data' => $data,
452
+
453
+ ]);
454
+
455
+
456
+
457
+ } catch(ReserveDuplicationException $e) {
458
+
459
+ throw $e;
460
+
461
+ }
462
+
463
+
464
+
465
+
466
+
467
+ }
468
+
469
+ }
470
+
179
471
 
180
472
 
181
473
  ```
182
474
 
183
475
 
184
476
 
185
- #### model
477
+ #### View(formの部分だけ抜粋)
186
478
 
187
479
  ```php
188
480
 
189
- <?php
190
-
191
-
192
-
193
- namespace App;
194
-
195
-
196
-
197
- use Illuminate\Database\Eloquent\Model;
198
-
199
- use Webpatser\Uuid\Uuid;
200
-
201
- use Katteba\UUID\UUIDShortener;
202
-
203
-
204
-
205
- class Reserve extends Model {
206
-
207
- public $incrementing = false;
208
-
209
-
210
-
211
- protected $fillable = [
212
-
213
- 'user_id',
214
-
215
- 'facility_id',
216
-
217
- 'start_time',
218
-
219
- 'end_time',
220
-
221
-
222
-
223
- ];
224
-
225
-
226
-
227
- protected static function boot () {
228
-
229
- parent::boot();
230
-
231
-
232
-
233
- static::creating(function ($model) {
234
-
235
- $model->{$model->getKeyName()} = Uuid::generate()->string;
236
-
237
- });
238
-
239
- }
240
-
241
-
242
-
243
- public function user() {
244
-
245
- return $this->belongsTo('App\User');
246
-
247
- }
248
-
249
-
250
-
251
- public function facility() {
252
-
253
- return $this->belongsTo('App\Facility');
254
-
255
- }
256
-
257
-
258
-
259
- static function SearchReserveDates($facility_name, $dateinfo) {
260
-
261
-
262
-
263
- $result = \App\Reserve::whereHas('Facility', function($query) use($facility_name, $dateinfo) {
264
-
265
- $query
266
-
267
- ->where('facility_name',$facility_name)
268
-
269
- ->whereDate('start_time',$dateinfo)
270
-
271
- ->whereDate('end_time',$dateinfo);
272
-
273
- })->select('id', 'start_time', 'end_time')->get()->all();
274
-
275
- return $result;
276
-
277
- }
278
-
279
- }
481
+
482
+
483
+ <form method="POST" id="test">
484
+
485
+ @csrf
486
+
487
+ <div class="form-group row">
488
+
489
+ <label for="facility_name" class="col-md-4 col-form-label text-md-right">{{ __('facility_name' )}}</label>
490
+
491
+
492
+
493
+ <div class="col-md-6">
494
+
495
+ <select class="form-control" id="facility_name" name="facility_name">
496
+
497
+ <option value="blank" selected="selected">選択してください</option>
498
+
499
+ <option value="test1">test1</option>
500
+
501
+ <option value="test2">test2</option>
502
+
503
+ <option value="test3">test4</option>
504
+
505
+ </select>
506
+
507
+
508
+
509
+ </div>
510
+
511
+ </div>
512
+
513
+
514
+
515
+ <div class="form-group row">
516
+
517
+ <label for="dates" class="col-md-4 col-form-label text-md-right">{{ __('dates' )}}</label>
518
+
519
+
520
+
521
+ <div class="col-md-6">
522
+
523
+ <input type="text" class="form-control dateinfo" placeholder="Select Date.." id="dateinfo" name="dateinfo" readonly="readonly">
524
+
525
+
526
+
527
+ </div>
528
+
529
+ </div>
530
+
531
+
532
+
533
+ <div class="form-group row">
534
+
535
+ <div class="col-md-8 offset-md-4">
536
+
537
+ <button type="submit" class="btn btn-primary" data-action='javascript:void(0);' id="date-select">
538
+
539
+ {{ __('submit') }}
540
+
541
+ </button>
542
+
543
+
544
+
545
+ </div>
546
+
547
+ </div>
548
+
549
+
550
+
551
+ <div class="form-group row js-timeselectform" >
552
+
553
+ <label for="start_time" class="col-md-4 col-form-label text-md-right">{{ __('start_time' )}}</label>
554
+
555
+
556
+
557
+ <div class="col-md-6">
558
+
559
+ <input type="text" class="form-control time" placeholder="Select Time.." id="start_time" name="start_time" readonly="readonly">
560
+
561
+
562
+
563
+ </div>
564
+
565
+ </div>
566
+
567
+
568
+
569
+ <div class="form-group row js-timeselectform">
570
+
571
+ <label for="end_time" class="col-md-4 col-form-label text-md-right">{{ __('end_time' )}}</label>
572
+
573
+
574
+
575
+ <div class="col-md-6">
576
+
577
+ <input type="text" class="form-control time" placeholder="Select Time.." id="end_time" name="end_time" readonly="readonly">
578
+
579
+
580
+
581
+ </div>
582
+
583
+ </div>
584
+
585
+
586
+
587
+ <div class="form-group row js-timeselectform">
588
+
589
+ <div class="col-md-8 offset-md-4">
590
+
591
+ <button type="submit" class="btn btn-primary" data-action="{{ route('reserve.confirm') }}" id="reserve-settle">
592
+
593
+ {{ __('reserve-settle') }}
594
+
595
+ </button>
596
+
597
+ </div>
598
+
599
+ </div>
600
+
601
+ </form>
602
+
603
+ </div>
604
+
605
+ </div>
606
+
607
+ <!-- 予約時間重複によるエラーメッセージ表示。仮置してます。 -->
608
+
609
+ @if ($errors->any())
610
+
611
+ <ul id = "error" class="error">
612
+
613
+ @foreach ($errors->all() as $error)
614
+
615
+
616
+
617
+ <li>{{ $error }}</li>
618
+
619
+
620
+
621
+ @endforeach
622
+
623
+ </ul>
624
+
625
+ @endif
626
+
627
+
628
+
629
+ (後略)
280
630
 
281
631
  ```
282
632
 
283
633
 
284
634
 
635
+ ## 質問に際してやったこと・作ったもの
636
+
637
+
638
+
639
+ ####console.log一覧
640
+
285
- #### Controller(作成途中につき、今回の処理に関係するところを抜粋)
641
+ ![イメージ説明](bf9d85eeb4899a2eb321994921a1f7d8.png)
642
+
643
+
644
+
645
+ ####定義しているテーブル
646
+
647
+ ![イメージ説明](3ea1e3d5e942984d320f517afee539f5.png)
648
+
649
+
650
+
651
+ ## 追記
652
+
653
+
654
+
655
+ ####Handler.php
656
+
657
+
286
658
 
287
659
  ```php
288
660
 
661
+
662
+
663
+ public function prepareResponse($request, Exception $e) {
664
+
289
- <?php
665
+ // 競合違反を条件分岐
290
-
291
-
292
-
666
+
293
- namespace App\Http\Controllers;
667
+ if($e instanceof ConflictHttpException) {
294
-
295
-
296
-
668
+
297
- use App\Reserve;
669
+ return $this->invaildHttpRequest($request, $e);
670
+
298
-
671
+ }
672
+
673
+ // 予約時間が競合していた場合エラーハンドリング
674
+
299
- use App\Exceptions\ReserveDuplicationException;
675
+ if($e instanceof ReserveDuplicationException) {
676
+
300
-
677
+ return redirect()->back()->withInput()->withErrors('その時間帯はすでに予約が入っています');
678
+
679
+ }
680
+
681
+
682
+
301
- use App\Http\Requests\CreateReserveRequest;
683
+ return parent::prepareResponse($request, $e);
302
-
303
- use Carbon\Carbon;
304
-
305
- use Illuminate\Http\Request;
306
-
307
-
308
-
309
-
310
-
311
- class ReserveController extends Controller {
312
-
313
-
314
-
315
- // フォームから受け取った情報をもとにテーブルを検索、施設名から施設IDを引っ張り、日付と合わせて予約情報を取得しAjaxに返す。
316
-
317
- public function searchReservation(Request $request) {
318
-
319
-
320
-
321
- $data = $request->all();
322
-
323
-
324
-
325
- if(isset($data['dateinfo']) && isset($data['facility_name'])) {
326
-
327
-
328
-
329
- $dateinfo = $data['dateinfo'];
330
-
331
- $facility_name = $data['facility_name'];
332
-
333
-
334
-
335
- $reserveinfo = Reserve::SearchReserveDates($facility_name, $dateinfo);
336
-
337
-
338
-
339
- \Debugbar::info();
340
-
341
-
342
-
343
- return json_encode($reserveinfo, JSON_PRETTY_PRINT);
344
-
345
-
346
-
347
- } else {
348
-
349
- echo 'FAIL TO AJAX REQUEST';
350
684
 
351
685
  }
352
686
 
353
- }
354
-
355
-
356
-
357
- // 入力確認画面に最終的なフォームの値を渡す。Requestにはバリデーションの拡張クラスを渡す。
358
-
359
- public function confirm(CreateReserveRequest $request) {
360
-
361
-
362
-
363
- // 予約情報取得
364
-
365
-
366
-
367
- $data = $request->all();
368
-
369
-
370
-
371
- if(isset($data['dateinfo']) && isset($data['facility_name'])) {
372
-
373
-
374
-
375
- $dateinfo = $data['dateinfo'];
376
-
377
- $facility_name = $data['facility_name'];
378
-
379
-
380
-
381
- $reserveinfo = Reserve::SearchReserveDates($facility_name, $dateinfo);
382
-
383
- }
384
-
385
-
386
-
387
-
388
-
389
- // 取得したレコードを配列の形にする。
390
-
391
- // start_timeとend_timeそれぞれの値で配列を作る。
392
-
393
-
394
-
395
- $arr_start_time = array_column($reserveinfo, 'start_time');
396
-
397
- // var_dump($arr_start_time);
398
-
399
- $arr_end_time = array_column($reserveinfo, 'end_time');
400
-
401
- // var_dump($arr_end_time);
402
-
403
-
404
-
405
- // 選択された時間帯が予約時間と重複していないか検証
406
-
407
- if(isset($data['start_time']) && isset($data['end_time'])) {
408
-
409
-
410
-
411
- // datetime型に整形
412
-
413
- $start_datetime =$data['dateinfo'] .' '. $data['start_time'];
414
-
415
- $end_datetime =$data['dateinfo'] .' '. $data['end_time'];
416
-
417
-
418
-
419
- // Carbonに整形
420
-
421
-
422
-
423
- $st = new Carbon($start_datetime);
424
-
425
- $start = $st->format('Y-m-d H:i:s');
426
-
427
- // var_dump($start);
428
-
429
- $ed = new Carbon($end_datetime);
430
-
431
- $end = $ed->format('Y-m-d H:i:s');
432
-
433
- // var_dump($end);
434
-
435
- // テーブルから予約情報取得して配列に格納
436
-
437
- // それぞれ$arr_start_time[]と$arr_end_times[]で呼び出せるようにする
438
-
439
- // forかwhile文で$start_time[n]と$end_time[n]まで検証する
440
-
441
-
442
-
443
- // $arr_start_time及び$arr_end_timeの配列の数を取得する。
444
-
445
- $c1 = count($arr_start_time);
446
-
447
- $c2 = count($arr_end_time);
448
-
449
-
450
-
451
-
452
-
453
- // 時間帯比較の関数
454
-
455
- function isTimeDuplication($start, $end, $start_time, $end_time) {
456
-
457
- return ($start < $end_time && $start_time < $end);
458
-
459
- }
460
-
461
- // try-catchで例外が出たら処理中止する。
462
-
463
-
464
-
465
- try {
466
-
467
-
468
-
469
- for ($i=0; $i < $c1 && $c2 ; $i++) {
470
-
471
-
472
-
473
- $start_time = $arr_start_time[$i];
474
-
475
- $end_time = $arr_end_time[$i];
476
-
477
-
478
-
479
- $result = isTimeDuplication($start, $end, $start_time, $end_time);
480
-
481
-
482
-
483
- if($result === TRUE) {
484
-
485
- throw new ReserveDuplicationException;
486
-
487
- }
488
-
489
- }
490
-
491
-
492
-
493
- // 入力確認ページのviewにinputsを渡す
494
-
495
- return view('reserve-confirm', [
496
-
497
- 'data' => $data,
498
-
499
- ]);
500
-
501
-
502
-
503
- } catch(ReserveDuplicationException $e) {
504
-
505
- throw $e;
506
-
507
- }
508
-
509
-
510
-
511
-
512
-
513
- }
514
-
515
- }
516
-
517
687
 
518
688
 
519
689
  ```
520
-
521
-
522
-
523
- #### View(formの部分だけ抜粋)
524
-
525
- ```php
526
-
527
-
528
-
529
- <form method="POST" id="test">
530
-
531
- @csrf
532
-
533
- <div class="form-group row">
534
-
535
- <label for="facility_name" class="col-md-4 col-form-label text-md-right">{{ __('facility_name' )}}</label>
536
-
537
-
538
-
539
- <div class="col-md-6">
540
-
541
- <select class="form-control" id="facility_name" name="facility_name">
542
-
543
- <option value="blank" selected="selected">選択してください</option>
544
-
545
- <option value="test1">test1</option>
546
-
547
- <option value="test2">test2</option>
548
-
549
- <option value="test3">test4</option>
550
-
551
- </select>
552
-
553
-
554
-
555
- </div>
556
-
557
- </div>
558
-
559
-
560
-
561
- <div class="form-group row">
562
-
563
- <label for="dates" class="col-md-4 col-form-label text-md-right">{{ __('dates' )}}</label>
564
-
565
-
566
-
567
- <div class="col-md-6">
568
-
569
- <input type="text" class="form-control dateinfo" placeholder="Select Date.." id="dateinfo" name="dateinfo" readonly="readonly">
570
-
571
-
572
-
573
- </div>
574
-
575
- </div>
576
-
577
-
578
-
579
- <div class="form-group row">
580
-
581
- <div class="col-md-8 offset-md-4">
582
-
583
- <button type="submit" class="btn btn-primary" data-action='javascript:void(0);' id="date-select">
584
-
585
- {{ __('submit') }}
586
-
587
- </button>
588
-
589
-
590
-
591
- </div>
592
-
593
- </div>
594
-
595
-
596
-
597
- <div class="form-group row js-timeselectform" >
598
-
599
- <label for="start_time" class="col-md-4 col-form-label text-md-right">{{ __('start_time' )}}</label>
600
-
601
-
602
-
603
- <div class="col-md-6">
604
-
605
- <input type="text" class="form-control time" placeholder="Select Time.." id="start_time" name="start_time" readonly="readonly">
606
-
607
-
608
-
609
- </div>
610
-
611
- </div>
612
-
613
-
614
-
615
- <div class="form-group row js-timeselectform">
616
-
617
- <label for="end_time" class="col-md-4 col-form-label text-md-right">{{ __('end_time' )}}</label>
618
-
619
-
620
-
621
- <div class="col-md-6">
622
-
623
- <input type="text" class="form-control time" placeholder="Select Time.." id="end_time" name="end_time" readonly="readonly">
624
-
625
-
626
-
627
- </div>
628
-
629
- </div>
630
-
631
-
632
-
633
- <div class="form-group row js-timeselectform">
634
-
635
- <div class="col-md-8 offset-md-4">
636
-
637
- <button type="submit" class="btn btn-primary" data-action="{{ route('reserve.confirm') }}" id="reserve-settle">
638
-
639
- {{ __('reserve-settle') }}
640
-
641
- </button>
642
-
643
- </div>
644
-
645
- </div>
646
-
647
- </form>
648
-
649
- ```
650
-
651
-
652
-
653
-
654
-
655
- ## 質問に際してやったこと・作ったもの
656
-
657
-
658
-
659
- ####console.log一覧
660
-
661
- ![イメージ説明](bf9d85eeb4899a2eb321994921a1f7d8.png)
662
-
663
-
664
-
665
- ####定義しているテーブル
666
-
667
- ![イメージ説明](3ea1e3d5e942984d320f517afee539f5.png)

3

指摘を受けた箇所を修正。

2020/01/09 18:29

投稿

kamille-mio
kamille-mio

スコア24

test CHANGED
File without changes
test CHANGED
@@ -296,6 +296,8 @@
296
296
 
297
297
  use App\Reserve;
298
298
 
299
+ use App\Exceptions\ReserveDuplicationException;
300
+
299
301
  use App\Http\Requests\CreateReserveRequest;
300
302
 
301
303
  use Carbon\Carbon;
@@ -320,7 +322,7 @@
320
322
 
321
323
 
322
324
 
323
- if(isset($_POST['dateinfo']) && isset($_POST['facility_name'])) {
325
+ if(isset($data['dateinfo']) && isset($data['facility_name'])) {
324
326
 
325
327
 
326
328
 
@@ -360,168 +362,156 @@
360
362
 
361
363
  // 予約情報取得
362
364
 
365
+
366
+
367
+ $data = $request->all();
368
+
369
+
370
+
371
+ if(isset($data['dateinfo']) && isset($data['facility_name'])) {
372
+
373
+
374
+
375
+ $dateinfo = $data['dateinfo'];
376
+
377
+ $facility_name = $data['facility_name'];
378
+
379
+
380
+
381
+ $reserveinfo = Reserve::SearchReserveDates($facility_name, $dateinfo);
382
+
383
+ }
384
+
385
+
386
+
387
+
388
+
389
+ // 取得したレコードを配列の形にする。
390
+
391
+ // start_timeとend_timeそれぞれの値で配列を作る。
392
+
363
393
 
364
394
 
395
+ $arr_start_time = array_column($reserveinfo, 'start_time');
396
+
397
+ // var_dump($arr_start_time);
398
+
399
+ $arr_end_time = array_column($reserveinfo, 'end_time');
400
+
401
+ // var_dump($arr_end_time);
402
+
403
+
404
+
405
+ // 選択された時間帯が予約時間と重複していないか検証
406
+
365
- if(isset($_POST['dateinfo']) && isset($_POST['facility_name'])) {
407
+ if(isset($data['start_time']) && isset($data['end_time'])) {
408
+
409
+
410
+
366
-
411
+ // datetime型に整形
412
+
367
-
413
+ $start_datetime =$data['dateinfo'] .' '. $data['start_time'];
414
+
368
-
415
+ $end_datetime =$data['dateinfo'] .' '. $data['end_time'];
416
+
417
+
418
+
419
+ // Carbonに整形
420
+
421
+
422
+
423
+ $st = new Carbon($start_datetime);
424
+
425
+ $start = $st->format('Y-m-d H:i:s');
426
+
427
+ // var_dump($start);
428
+
429
+ $ed = new Carbon($end_datetime);
430
+
369
- $dateinfo = $_POST['dateinfo'];
431
+ $end = $ed->format('Y-m-d H:i:s');
432
+
370
-
433
+ // var_dump($end);
434
+
435
+ // テーブルから予約情報取得して配列に格納
436
+
437
+ // それぞれ$arr_start_time[]と$arr_end_times[]で呼び出せるようにする
438
+
439
+ // forかwhile文で$start_time[n]と$end_time[n]まで検証する
440
+
441
+
442
+
443
+ // $arr_start_time及び$arr_end_timeの配列の数を取得する。
444
+
445
+ $c1 = count($arr_start_time);
446
+
447
+ $c2 = count($arr_end_time);
448
+
449
+
450
+
451
+
452
+
453
+ // 時間帯比較の関数
454
+
455
+ function isTimeDuplication($start, $end, $start_time, $end_time) {
456
+
457
+ return ($start < $end_time && $start_time < $end);
458
+
459
+ }
460
+
461
+ // try-catchで例外が出たら処理中止する。
462
+
463
+
464
+
465
+ try {
466
+
467
+
468
+
469
+ for ($i=0; $i < $c1 && $c2 ; $i++) {
470
+
471
+
472
+
371
- $facility_name = $_POST['facility_name'];
473
+ $start_time = $arr_start_time[$i];
474
+
372
-
475
+ $end_time = $arr_end_time[$i];
373
-
374
-
476
+
477
+
478
+
375
- $reserveinfo = Reserve::SearchReserveDates($facility_name, $dateinfo);
479
+ $result = isTimeDuplication($start, $end, $start_time, $end_time);
480
+
481
+
482
+
483
+ if($result === TRUE) {
484
+
485
+ throw new ReserveDuplicationException;
486
+
487
+ }
488
+
489
+ }
490
+
491
+
492
+
493
+ // 入力確認ページのviewにinputsを渡す
494
+
495
+ return view('reserve-confirm', [
496
+
497
+ 'data' => $data,
498
+
499
+ ]);
500
+
501
+
502
+
503
+ } catch(ReserveDuplicationException $e) {
504
+
505
+ throw $e;
506
+
507
+ }
508
+
509
+
376
510
 
377
511
 
378
512
 
379
513
  }
380
514
 
381
-
382
-
383
- // 取得したレコードを配列の形にする。
384
-
385
- // start_timeとend_timeそれぞれの値で配列を作る。
386
-
387
-
388
-
389
- $arr_start_time = array_column($reserveinfo, 'start_time');
390
-
391
- var_dump($arr_start_time);
392
-
393
- $arr_end_time = array_column($reserveinfo, 'end_time');
394
-
395
- var_dump($arr_end_time);
396
-
397
-
398
-
399
- // 選択された時間帯が予約時間と重複していないか検証
400
-
401
- if(isset($_POST['start_time']) && isset($_POST['end_time'])) {
402
-
403
-
404
-
405
- // datetime型に整形
406
-
407
- $start_datetime =$_POST['dateinfo'] .' '. $_POST['start_time'];
408
-
409
- $end_datetime =$_POST['dateinfo'] .' '. $_POST['end_time'];
410
-
411
-
412
-
413
- // Carbonに整形
414
-
415
-
416
-
417
- $st = new Carbon($start_datetime);
418
-
419
- $start = $st->format('Y-m-d H:i:s');
420
-
421
- var_dump($start);
422
-
423
- $ed = new Carbon($end_datetime);
424
-
425
- $end = $ed->format('Y-m-d H:i:s');
426
-
427
- var_dump($end);
428
-
429
- // テーブルから予約情報取得して配列に格納
430
-
431
- // それぞれ$arr_start_time[]と$arr_end_times[]で呼び出せるようにする
432
-
433
- // forかwhile文で$start_time[n]と$end_time[n]まで検証する
434
-
435
-
436
-
437
- // $arr_start_time及び$arr_end_timeの配列の数を取得する。
438
-
439
- $c1 = count($arr_start_time);
440
-
441
- $c2 = count($arr_end_time);
442
-
443
-
444
-
445
- /*
446
-
447
-      以下の関数を用いてフォームで選択された時間と登録されている予約情報の時間とで
448
-
449
-      比較を行い、予約済みの時間帯と重複していた場合はエラーハンドリングを行いたい。
450
-
451
-     */
452
-
453
- function isTimeDuplication($start, $end, $start_time, $end_time) {
454
-
455
- return ($start < $end_time && $start_time < $end);
456
-
457
- }
458
-
459
-
460
-
461
- // 予約情報の数だけ時間帯比較を行いたいと考えて以下のようなコードを書いた。
462
-
463
- for ($i=0; $i < $c1 && $c2 ; $i++) {
464
-
465
-
466
-
467
- $start_time = $arr_start_time[$i];
468
-
469
- $end_time = $arr_end_time[$i];
470
-
471
-
472
-
473
- $result = isTimeDuplication($start, $end, $start_time, $end_time);
474
-
475
-
476
-
477
- // 時間帯比較がTRUE、つまり重複した時間帯があった場合エラーメッセージ、違うなら比較をを続行する。
478
-
479
- if(isTimeDuplication($start, $end, $start_time, $end_time) === TRUE) {
480
-
481
- echo 'error';
482
-
483
- var_dump($result);
484
-
485
- break;
486
-
487
-
488
-
489
- }
490
-
491
-
492
-
493
-
494
-
495
- }
496
-
497
-
498
-
499
- // ここまで書いてもしかしたら、try-catchしたほうがいいけどその場合例外処理どうするのだろうと詰まりました。
500
-
501
-
502
-
503
- // 以下は比較でいずれも例外が認められなかった場合の処理
504
-
505
-
506
-
507
- //フォームから受け取ったすべてのinputの値を取得
508
-
509
- $inputs = $request->all();
510
-
511
-
512
-
513
- // 確認ページのviewにinputsを渡す
514
-
515
- return view('reserve-confirm', [
516
-
517
- 'inputs' => $inputs,
518
-
519
- ]);
520
-
521
- }
522
-
523
-
524
-
525
515
  }
526
516
 
527
517
 

2

レイアウト修正

2020/01/09 18:18

投稿

kamille-mio
kamille-mio

スコア24

test CHANGED
File without changes
test CHANGED
@@ -666,10 +666,12 @@
666
666
 
667
667
 
668
668
 
669
+ ####console.log一覧
670
+
669
- console.log一覧![イメージ説明](bf9d85eeb4899a2eb321994921a1f7d8.png)
671
+ ![イメージ説明](bf9d85eeb4899a2eb321994921a1f7d8.png)
670
-
671
-
672
-
672
+
673
+
674
+
673
- 定義しているテーブル
675
+ ####定義しているテーブル
674
676
 
675
677
  ![イメージ説明](3ea1e3d5e942984d320f517afee539f5.png)

1

誤字修正

2020/01/06 19:32

投稿

kamille-mio
kamille-mio

スコア24

test CHANGED
File without changes
test CHANGED
@@ -58,7 +58,7 @@
58
58
 
59
59
  #### AjaxでPHPから帰ってくる予約情報
60
60
 
61
- ちなみにid3は2019-11-30とは別の日付の予約情報なので弾かれています。
61
+ ちなみにid3は2019-11-30とは別の日付の予約情報なので弾かれています。
62
62
 
63
63
  ```
64
64