お疲れ様です。先日のエラーですがミニプログラムを作成したので、添付します。
オリジナルのバリデートを作成しているクラス
php
1<?php 2 3namespace App\Providers; 4 5use Illuminate\Support\ServiceProvider; 6use Illuminate\Support\Facades\Validator; 7 8class Test_ValidationServiceProvider extends ServiceProvider 9{ 10 /** 11 * Register services. 12 * 13 * @return void 14 */ 15 public function register() 16 { 17 // 18 } 19 20 /** 21 * Bootstrap services. 22 * 23 * @return void 24 */ 25 public function boot() 26 { 27 28 //特殊文字は許さない 29 /*以下の条件に一致しない(特殊文字が含まれている)ときにエラー処理を行う*/ 30 Validator::extend('invalid', function ($attribute, $value, $parameters, $validator) { 31 $pattern = '-._~%:/?#[]@!$&\'()*+,;='; 32 $pattern = preg_quote($pattern, '/'); 33 $pattern = "/[^" . $pattern . "]/"; 34 return preg_match($pattern, $value); 35 }); 36 37 //IDとパスワードはパスワードは英数字を含んだ16文字以下 38 Validator::extend('passid', function ($attribute, $value, $parameters, $validator) { 39 return preg_match("/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{5,16}+\z/i", $value); 40 }); 41 } 42}
ルートです
php
1//テンプレであるコメントアウトは提示していません。 2Route::get('/', 'TestController@basic1'); 3Route::post('/basic1', 'TestController@basic1Check'); 4Route::post('/basic2', 'TestController@basic2');
オリジナルのバリデートをルールに追加しています
php
1<?php 2namespace App\Http\Requests; 3use Illuminate\Foundation\Http\FormRequest; 4 5class TestRequest extends FormRequest 6{ 7 /** 8 * Determine if the user is authorized to make this request. 9 * 10 * @return bool 11 */ 12 public function authorize() 13 { 14 return true; 15 } 16 17 /** 18 * Get the validation rules that apply to the request. 19 * 20 * @return array 21 */ 22 public function rules() 23 { 24 return [ 25 'name' => 'required|invalid|', 26 'id' => 'passid', 27 'pass' => 'passid|different:id', 28 ]; 29 } 30 31 public function messages() 32 { 33 return [ 34 //名前のバリデーション 35 'name.required' => '名前の入力は必須です', 36 'name.invalid' => '名前に使用できない文字が含まれています', 37 //idのバリデーション 38 'id.passid' => 'ログインIDは英数字を含んだ16文字以下で入力してください', 39 //passのバリデーション 40 'pass.passid' => 'パスワードは英数字を含んだ16文字以下で入力してください', 41 'pass.different' => 'IDと同じパスワードは設定できません', 42 ]; 43 } 44}
コントローラーです
php
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Http\Requests\TestRequest; 7 8class TestController extends Controller 9{ 10 //一番初めに呼ばれます 11 public function basic1() 12 { 13 $hash = array( 14 'name' => null, 15 'id' => null, 16 'pass' => null, 17 ); 18 return view('tests.test_basic1')->with($hash); 19 } 20 //test_basic1から送信された値がバリデートを通過したあとの処理です 21 public function basic1Check(TestRequest $request) 22 { 23 $name = $request->name; 24 $id = $request->id; 25 $pass = $request->pass; 26 //値を配列に格納し、分解します 27 $basic1 = ['name' => $name, 'id' => $id, 'pass' => $pass]; 28 //この値がtest_basic2のbuttonタグのvalueに入ります 29 $basic1Str = implode(',', $basic1); 30 return view('tests.test_basic2', ['basic1Str' => $basic1Str]); 31 } 32 33 public function basic2(Request $request) 34 { 35//このifでbackボタンが押されたかどうか判断していま 36 if (isset($request->basic1Str)) { 37 $basic1 = explode(',', $request->basic1Str); 38 $name = $basic1[0]; 39 $id = $basic1[1]; 40 $pass = $basic1[2]; 41 42 $hash = array( 43 'name' => $name, 44 'id' => $id, 45 'pass' => $pass, 46 ); 47 return view('tests.test_basic1')->with($hash); 48 } 49 return view('tests.test_basic2'); 50 } 51}
以下bladeです
blade
1{{--一部抜粋です(test_basic1.php)--}} 2 <form method="post" action="/basic1"> 3 {{ csrf_field() }} 4 <p>ナマエ</p> 5 <input type="text" name="name" value="{{ old('name', $name) }}"> 6 @if ($errors->has('name')) 7 <span class="errormsg">{{ $errors->first('name') }}</span> 8 @endif 9 10 11 <p>ログインID</p> 12 <input type="text" name="id" value="{{ old('id', $id) }}"> 13 @if ($errors->has('id')) 14 <span class="errormsg">{{ $errors->first('id') }}</span> 15 @endif 16 17 18 <p>パスワード</p> 19 <input type="text" name="pass" value="{{ old('pass', $pass) }}"> 20 @if ($errors->has('pass')) 21 <span class="errormsg">{{ $errors->first('pass') }}</span> 22 @endif 23 24 <button type="submit" class="btn btn-primary mb-5">Next</button> 25 </form>
blade
1{{--一部抜粋です(test_basic2.php)--}} 2 <form method="post" action="/basic2"> 3 {{ csrf_field() }} 4 5 <select id="inputReason" class="custom-select"> 6 <option selected>Open this select menu</option> 7 <option value="1">One</option> 8 <option value="2">Two</option> 9 <option value="3">Three</option> 10 </select> 11 <button type="submit">Next</button> 12 <button type="submit" name="basic1Str" value="{{ $basic1Str }}">back</button> 13 </form>
問題
①一番初めにurlに'/'のurlを打つ
②test_basic1.blade.php表示
③
test_basic1.balde.phpでバリデートを通過する値を入力(通過しない値でもきちんと画面に設定したエラーメッセージがでる。)
④通過するとtest_basic2.blade.phpを表示(backボタンのvalueにはtest_basic1で入力した値がきちんと入っていることは確認済みです)
⑤backボタンを押す
⑥test_basic1.blade.phpが表示され、先ほど入力した値がすでに入力済み(期待値)
⑦-1
バリデート通過する値を入力すると問題なくtest_basic2.blade.phpが表示される
⑦-2
バリデート通過しない値を入力すると以下のエラーが表示される
error
1The GET method is not supported for this route. Supported methods: POST.
一番初めにtest_basic1.blade.phpでバリデートエラーを出してもtest_basic2.blade.phpからtest_basic1.blade.phpに戻ってきてバリデートエラーを出しても動きは同じだと思うのですが、何が問題でしょうか。
またバリデートクラスの作成は以下のサイトの方法と全く同じです。
Laravelのカスタムバリデーション
回答2件
あなたの回答
tips
プレビュー