2017.9.25
Livvon#12【コントローラーへのリダイレクト】
僕の一番嫌いなエラーの紹介です(笑)(笑)(笑)
この
MethodNotAllowedException、最初はルートのエラーだと思うんですが、これ実はバリデーションエラーなんですよね。
コントローラー内でバリデーションせずに、リクエストの段階でバリデーションするとこのエラーが出るんですよね・・・・・・。
どこが間違ってるんだよって不貞腐れて探してると案外ショボいとこでミスってるっていうね...
今回、新たに導入してみようと思うのが
コントローラーアクションへのリダイレクトです。
というのも、今は
BookControllerを書いており、このコントローラーはその名の示す通り、予約に関するアクションを定義しているんですけど、段々と肥大化していくことが予想されるので、ハンドシェイク部分は分けようかなって思ったんですね。
つまり
HandshakeController的なものを定義したい、と。
ただ、予約フォームからハンドシェイクの流れは切れないし、予約フォームの確認画面をBookControllerに書いてしまったし、まぁ実際予約フォームはハンドシェイクとはあんま関係ないしということで、あんまりハンドシェイク用のコントローラーに入れたくないんですよね。
つまり、やりたいこととしては、予約フォームのバリデーションを通過し、メールを送信する、って段階になったらハンドシェイク用のコントローラーに飛ぶ、という処理がやりたいわけです。
リファレンスを見ると、その実現はとても簡単です。
|
return redirect()->action('HomeController@index');
|
コントローラーアクションへのリダイレクト、と冠してこんな記述があるわけですね。
やはりコントローラーを管理しやすいように分けると劇的に見やすくなりますからね。神クラスを作りたがる悪癖を頑張って克服するのだ(笑)(笑)(笑)
これで住み分けができましたね。今後、BookControllerには、予約の確認やキャンセルなどの機能を突っ込むことが予想されるので、今のうちにコード量を減らしておかなくてはなりません(笑)(笑)
ただ、実はリファレンスには書かれてないのですが、重要な点がもう一つあります。
それは、こいつはあくまでもリダイレクト・・・・・・つまり
新たにルートを登録しなくてはいけないということです。
が、なんか引数の受け渡しが上手く行ってないって感じだし、そもそも直接アクセスされるようにルートを定義するのもいけ好かないので
staticにして無理やり呼び出すことにしました。
use App\Http\Controllers\HandshakeController;
...
return HandshakeController::start($request, $host);//ハンドシェイクを開始する
動きゃいいんだよ()
結果をそのままreturnしているから、コントローラー側で何か気を使わなくてもいいのである。動かないものは仕方ないのでこうする他ないのだ、うん(笑)
あと、ついでにメール関連でクッソうざいエラーが出たのでそのメモを。(笑)
メールを送信しようとしたらこんな意味わかんないエラーがでちゃいましてね。こーいうふんわりしたエラーはエラー箇所が掴めないから嫌いなんだよ・・・・・・笑
クロージャーなんてどこにも使ってない気がするんだけどなぁ、、、って思って色々試してみたところ、どうやらRequestをそのままMailに渡しているのがマズかったようです。
//ホストにメールを送信する
Mail::to($host->get_email())
->queue(new HandshakeStart($token,$request,$deadline,$handshakeid));//これを
//ホストにメールを送信する
Mail::to($host->get_email())
->queue(new HandshakeStart($token,$request->all(),$deadline,$handshakeid));//こう!!!
なんでこれで上手くいくのかは知りませんが、とりあえずオブジェクトを渡してくんなやボケって感じなんですかね(笑)(笑)