teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

更新

2019/06/14 07:44

投稿

Chandler_Bing
Chandler_Bing

スコア673

title CHANGED
File without changes
body CHANGED
File without changes

1

更新

2019/06/14 07:44

投稿

Chandler_Bing
Chandler_Bing

スコア673

title CHANGED
File without changes
body CHANGED
@@ -1,229 +1,225 @@
1
+ お疲れ様です。先日のエラーですがミニプログラムを作成したので、添付します。
2
+
1
- 1番初めのルート
3
+ オリジナのバリデートを作成しているクラス
2
4
  ```php
5
+ <?php
6
+
7
+ namespace App\Providers;
8
+
9
+ use Illuminate\Support\ServiceProvider;
10
+ use Illuminate\Support\Facades\Validator;
11
+
12
+ class Test_ValidationServiceProvider extends ServiceProvider
13
+ {
14
+ /**
15
+ * Register services.
16
+ *
17
+ * @return void
18
+ */
19
+ public function register()
20
+ {
21
+ //
22
+ }
23
+
24
+ /**
25
+ * Bootstrap services.
26
+ *
27
+ * @return void
28
+ */
29
+ public function boot()
30
+ {
31
+
32
+ //特殊文字は許さない
33
+ /*以下の条件に一致しない(特殊文字が含まれている)ときにエラー処理を行う*/
34
+ Validator::extend('invalid', function ($attribute, $value, $parameters, $validator) {
3
- Route::get('/', 'BasicController@basic1');
35
+ $pattern = '-._~%:/?#[]@!$&\'()*+,;=';
36
+ $pattern = preg_quote($pattern, '/');
37
+ $pattern = "/[^" . $pattern . "]/";
38
+ return preg_match($pattern, $value);
39
+ });
40
+
41
+ //IDとパスワードはパスワードは英数字を含んだ16文字以下
42
+ Validator::extend('passid', function ($attribute, $value, $parameters, $validator) {
43
+ return preg_match("/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{5,16}+\z/i", $value);
44
+ });
45
+ }
46
+ }
4
47
  ```
48
+ ルートです
49
+ ```php
50
+ //テンプレであるコメントアウトは提示していません。
51
+ Route::get('/', 'TestController@basic1');
52
+ Route::post('/basic1', 'TestController@basic1Check');
53
+ Route::post('/basic2', 'TestController@basic2');
54
+ ```
55
+ オリジナルのバリデートをルールに追加しています
56
+ ```php
57
+ <?php
58
+ namespace App\Http\Requests;
59
+ use Illuminate\Foundation\Http\FormRequest;
5
60
 
61
+ class TestRequest extends FormRequest
62
+ {
63
+ /**
64
+ * Determine if the user is authorized to make this request.
65
+ *
66
+ * @return bool
67
+ */
68
+ public function authorize()
69
+ {
70
+ return true;
71
+ }
72
+
73
+ /**
74
+ * Get the validation rules that apply to the request.
75
+ *
76
+ * @return array
77
+ */
78
+ public function rules()
79
+ {
80
+ return [
81
+ 'name' => 'required|invalid|',
82
+ 'id' => 'passid',
83
+ 'pass' => 'passid|different:id',
84
+ ];
85
+ }
86
+
87
+ public function messages()
88
+ {
89
+ return [
6
- 1番初めトに呼ばれるアクション
90
+ //名前バリデーション
91
+ 'name.required' => '名前の入力は必須です',
92
+ 'name.invalid' => '名前に使用できない文字が含まれています',
93
+ //idのバリデーション
94
+ 'id.passid' => 'ログインIDは英数字を含んだ16文字以下で入力してください',
95
+ //passのバリデーション
96
+ 'pass.passid' => 'パスワードは英数字を含んだ16文字以下で入力してください',
97
+ 'pass.different' => 'IDと同じパスワードは設定できません',
98
+ ];
99
+ }
100
+ }
101
+ ```
102
+ コントローラーです
7
103
  ```php
104
+ <?php
105
+
106
+ namespace App\Http\Controllers;
107
+
108
+ use Illuminate\Http\Request;
109
+ use App\Http\Requests\TestRequest;
110
+
111
+ class TestController extends Controller
112
+ {
113
+ //一番初めに呼ばれます
8
114
  public function basic1()
9
115
  {
10
116
  $hash = array(
11
117
  'name' => null,
12
- 'kana' => null,
13
- 'name' => null,
14
- 'sex' => null,
15
- 'tel' => null,
16
- 'email' => null,
17
118
  'id' => null,
18
119
  'pass' => null,
19
120
  );
20
- return view('register.basic1')->with($hash);
121
+ return view('tests.test_basic1')->with($hash);
21
122
  }
22
- ```
23
-
24
- 表示先のビューで項目を入力し、ボタンを押しそれを受けるルート
25
- ```php
26
- Route::post('/basic1', 'BasicController@basic1Check');
123
+   //test_basic1から送信された値がバリデートを通過したあとの処理です
27
- ```
28
- そのルートに呼ばれるアクション(自作のバリデートクラスを使用)。
29
- 入力項目を操作し、次のページへ。
30
- ```php
31
- public function basic1Check(BasicRequest $request)
124
+ public function basic1Check(TestRequest $request)
32
125
  {
33
126
  $name = $request->name;
34
- $kana = $request->kana;
35
- $sex = $request->sex;
36
- $tel = $request->tel;
37
- $email = $request->email;
38
127
  $id = $request->id;
39
128
  $pass = $request->pass;
40
- //値を配列に格納します
129
+ //値を配列に格納し、分解します
41
- $basic1 = ['name' => $name, 'kana' => $kana, 'sex' => $sex, 'tel' => $tel, 'email' => $email, 'id' => $id, 'pass' => $pass];
130
+ $basic1 = ['name' => $name, 'id' => $id, 'pass' => $pass];
131
+ //この値がtest_basic2のbuttonタグのvalueに入ります
42
132
  $basic1Str = implode(',', $basic1);
43
- return view('register.basic2', ['basic1Str' => $basic1Str]);
133
+ return view('tests.test_basic2', ['basic1Str' => $basic1Str]);
44
134
  }
45
- ```
46
135
 
136
+ public function basic2(Request $request)
137
+ {
138
+ //このifでbackボタンが押されたかどうか判断していま
139
+ if (isset($request->basic1Str)) {
140
+ $basic1 = explode(',', $request->basic1Str);
141
+ $name = $basic1[0];
47
- このような流れです。
142
+ $id = $basic1[1];
143
+ $pass = $basic1[2];
48
144
 
49
- **問題**
50
- コード非常に長いので、全て載せることが出来ないのですが、2ページ目で戻るボタンを押し1ページ目に遷移するときちんと入力した値が保持されています。
51
-
52
- また値を変更し2ページ目に遷移し、再び1ページ目に遷移しても、きちんと直近の値がvalueに残っています。
53
-
54
- 問題は2ページ目から1ページ目に戻り、エラー値を入力した場合のみ以下のエラーが出ます。
55
- 1番初めに1ページ目にきて、エラー値を入力すると、きちんと自作クラスで定めたエラーメッセージが
56
- 画面に表示されます。
57
- ```error
145
+ $hash = array(
146
+ 'name' => $name,
147
+ 'id' => $id,
148
+ 'pass' => $pass,
149
+ );
58
- The GET method is not supported for this route. Supported methods: POST.
150
+ return view('tests.test_basic1')->with($hash);
151
+ }
152
+ return view('tests.test_basic2');
153
+ }
154
+ }
59
155
  ```
60
- 1回目と遷移後のバリデーションチェックの飛び先が違うのでしょうか。
61
- 念のため
156
+ 以下bladeです
62
- basic1.blade.phpとbasic2.blade.phpを貼っておきます
63
- ```php
157
+ ```blade
64
- @extends('layouts.layout')
65
-
66
- @section('title', 'basic1')
67
-
68
- @section('content')
158
+ {{--一部抜粋です(test_basic1.php)--}}
69
-
70
-
71
- <form method="post" action="/basic1">
159
+ <form method="post" action="/basic1">
72
-
73
- {{ csrf_field() }}
160
+ {{ csrf_field() }}
74
-
75
- <div class="form-group my-5">
161
+ <p>ナマエ</p>
76
- <label for="formGroupExampleInput" class="font-weight-bold">名前</label>
77
- <input type="text" name="name" class="form-control" id="formGroupExampleInput" placeholder="名前をスペースなしで入力してください"
78
- maxlength="64" value="{{ old('name', $name) }}">
162
+ <input type="text" name="name" value="{{ old('name', $name) }}">
79
163
  @if ($errors->has('name'))
80
164
  <span class="errormsg">{{ $errors->first('name') }}</span>
81
165
  @endif
82
- </div>
83
166
 
84
- <div class="form-group mb-5">
85
- <label for="formGroupExampleInput" class="font-weight-bold">ナマエ</label>
86
- <input type="text" name="kana" class="form-control" id="formGroupExampleInput" placeholder="ナマエをスペースなしで入力してください"
87
- maxlength="64" value="{{ old('kana', $kana) }}">
88
- @if ($errors->has('kana'))
89
- <span class="errormsg">{{ $errors->first('kana') }}</span>
90
- @endif
91
- </div>
92
167
 
93
- <p class="font-weight-bold h6">性別</p>
94
- <div class="custom-control custom-radio custom-control-inline mb-5">
95
- <input type="radio" id="customRadioInline1" name="sex" class="custom-control-input" value="male" @if (old('sex',
96
- $sex)=="male" ) checked @endif>
97
- <label class="custom-control-label font-weight-bold" for="customRadioInline1">男性</label>
98
- </div>
168
+ <p>ログインID</p>
99
- <div class="custom-control custom-radio custom-control-inline">
100
- <input type="radio" id="customRadioInline2" name="sex" class="custom-control-input" value="female"
101
- @if(old('sex', $sex)=="female" ) checked @endif>
102
- <label class="custom-control-label font-weight-bold" for="customRadioInline2">女性</label>
103
- </div>
104
- @if ($errors->has('sex'))
105
- <span class="errormsg">{{ $errors->first('sex') }}</span>
106
- @endif
107
-
108
- <div class="form-group mb-5">
109
- <label for="formGroupExampleInput" class="font-weight-bold">電話番号</label>
110
- <input type="tel" name="tel" class="form-control" id="formGroupExampleInput" placeholder="電話番号をハイフンなしで入力してください"
111
- value="{{ old('tel', $tel) }}">
112
- @if ($errors->has('tel'))
113
- <span class="errormsg">{{ $errors->first('tel') }}</span>
114
- @endif
115
- </div>
116
-
117
- <div class="form-group mb-5">
118
- <label for="formGroupExampleInput" class="font-weight-bold">メールアドレス(任意)</label>
119
- <input type="text" name="email" class="form-control" id="formGroupExampleInput" placeholder="メールアドレスを入力してください"
120
- value="{{ old('email', $email) }}">
121
- @if ($errors->has('email'))
122
- <span class="errormsg">{{ $errors->first('email') }}</span>
123
- @endif
124
- </div>
125
-
126
- <div class="form-group mb-5">
127
- <label for="formGroupExampleInput" class="font-weight-bold">ログインID</label>
128
- <input type="text" name="id" class="form-control" id="formGroupExampleInput"
129
- placeholder="ログインIDは英数字を含んだ16文字以下で入力してください" maxlength="16" value="{{ old('id', $id) }}">
169
+ <input type="text" name="id" value="{{ old('id', $id) }}">
130
170
  @if ($errors->has('id'))
131
171
  <span class="errormsg">{{ $errors->first('id') }}</span>
132
172
  @endif
133
- </div>
134
173
 
174
+
135
- <div class="form-group mb-5">
175
+ <p>パスワード</p>
136
- <label for="formGroupExampleInput" class="font-weight-bold">パスワード</label>
137
- <input type="text" name="pass" class="form-control" id="formGroupExampleInput"
176
+ <input type="text" name="pass" value="{{ old('pass', $pass) }}">
138
- placeholder="パスワードは英数字を含んだ16文字以下で入力してください" maxlength="16">
139
177
  @if ($errors->has('pass'))
140
178
  <span class="errormsg">{{ $errors->first('pass') }}</span>
141
179
  @endif
142
- </div>
143
180
 
144
- <button type="submit" class="btn btn-primary mb-5">Next</button>
181
+ <button type="submit" class="btn btn-primary mb-5">Next</button>
145
-
146
- </form>
182
+ </form>
147
- @endsection
148
183
  ```
149
184
 
150
- ```php
185
+ ```blade
151
- @extends('layouts.layout')
186
+ {{--一部抜粋です(test_basic2.php)--}}
187
+ <form method="post" action="/basic2">
188
+ {{ csrf_field() }}
152
189
 
153
- @section('title', 'basic2')
154
-
155
- @section('content')
156
-
157
- <form action="/basic2" method="post">
158
-
159
- {{ csrf_field() }}
160
-
161
- <div class="form-row mt-5">
162
- <div class="form-group col-md-6">
163
- <label for="inputZip" class="font-weight-bold">郵便番号</label>
164
- <input id="inputZip" class="form-control" type="text">
165
- </div>
166
- <div class="form-group col-md-6">
167
- <label for="inputState" class="font-weight-bold">都道府県</label>
168
- <select id="inputState" class="form-control">
169
- <option selected>Choose...</option>
170
- <option>...</option>
171
- </select>
172
- </div>
173
- </div>
174
-
175
- <div class="form-group my-5">
176
- <label for="inputAddress" class="font-weight-bold">以降の住所</label>
177
- <input id="inputAddress" class="form-control" type="text" placeholder="1234 Main St">
178
- </div>
179
-
180
- <div class="form-group mb-5">
181
- <label for="inputReason" class="font-weight-bold">知ったきっかけ</label>
182
190
  <select id="inputReason" class="custom-select">
183
191
  <option selected>Open this select menu</option>
184
192
  <option value="1">One</option>
185
193
  <option value="2">Two</option>
186
194
  <option value="3">Three</option>
187
195
  </select>
196
+ <button type="submit">Next</button>
197
+ <button type="submit" name="basic1Str" value="{{ $basic1Str }}">back</button>
188
- </div>
198
+ </form>
199
+ ```
200
+ **問題**
201
+ ①一番初めにurlに'/'のurlを打つ
189
202
 
190
- <div class="form-group mb-5">
191
- <label for="inputReason" class="font-weight-bold">目的</label>
192
- <select id="inputReason" class="custom-select">
193
- <option selected>Open this select menu</option>
194
- <option value="1">One</option>
195
- <option value="2">Two</option>
196
- <option value="3">Three</option>
197
- </select>
203
+ ②test_basic1.blade.php表示
198
- </div>
199
204
 
205
+
200
- <p class="font-weight-bold h6">TOEIC</p>
206
+ test_basic1.balde.phpでバリデートを通過する値を入力(通過しない値でもきちんと画面に設定したエラーメッセージがでる。)
201
- <div class="form-group mb-5">
202
- <div class="custom-control custom-switch custom-control-inline">
203
- <input id="customSwitch1" class="custom-control-input" type="radio" name="toeic" value="have">
204
- <label class="custom-control-label font-weight-bold" for="customSwitch1">受験経験あり</label>
205
- </div>
206
- <div class="custom-control custom-switch custom-control-inline">
207
- <input id="customSwitch2" class="custom-control-input" type="radio" name="toeic" value="have_not" checked>
208
- <label class="custom-control-label font-weight-bold" for="customSwitch2">受験経験なし</label>
209
- </div>
210
- </div>
211
207
 
212
- <div class="form-group mb-5">
213
- <label for="inputResult" class="font-weight-bold">点数</label>
208
+ ④通過するとtest_basic2.blade.phpを表示(backボタンのvalueにはtest_basic1で入力した値がきちんと入っていることは確認済みです)
214
- <input id="inputResult" class="form-control score" type="text" name="score" value="" placeholder="点数を入力してください">
215
- </div>
216
209
 
217
- <div class="form-group mb-5">
218
- <button type="submit" class="btn btn-primary mr-5">Next</button>
219
- <button type="submit" class="btn btn-secondary" id="" name="basic1Str" value="{{ $basic1Str }}">back</button>
220
- </div>
210
+ ⑤backボタンを押す
221
211
 
222
- </form>
212
+ ⑥test_basic1.blade.phpが表示され、先ほど入力した値がすでに入力済み(期待値)
223
- @endsection
224
213
 
214
+ ⑦-1
215
+ バリデート通過する値を入力すると問題なくtest_basic2.blade.phpが表示される
216
+ ⑦-2
225
- @section('script')
217
+ バリデート通過しない値を入力すると以下のエラーが表示される
218
+ ```error
226
- <script src="/js/main.js"></script>
219
+ The GET method is not supported for this route. Supported methods: POST.
227
- @endsection
220
+ ```
228
221
 
222
+ 一番初めにtest_basic1.blade.phpでバリデートエラーを出してもtest_basic2.blade.phpからtest_basic1.blade.phpに戻ってきてバリデートエラーを出しても動きは同じだと思うのですが、何が問題でしょうか。
223
+
229
- ```
224
+ またバリデートクラスの作成は以下のサイトの方法と全く同じです。
225
+ [Laravelのカスタムバリデーション](https://minory.org/laravel-custom-validation-rule.html)