2015.10.30
0からはじめるPHP#49【アジャイルで作る掲示板#8-バリデーションバグ#2&クッキー-】
昨日プレビューはサポート外にしてテストするとか言いましたが、その過程で結局
よく分からないけど解決はしました。
$validator = Validator::make($request->all(), [
/*バリデーション*/
]);
if ($validator->fails()) {
return back()
->withErrors($validator)
->withInput();
}
理由は分かりませんが
バリデーションインスタンスを自分で作成したら動きました。
正直「何が違うんだろう」って思いますがインスタンスを逐一生成することが鍵だったようです。たぶん。ほんとに意味わかんないですが。
これだけで終わってしまうととても悲しいので、もう一つ
クッキーの話をします。
クッキーって、食べる方じゃないです。
HTTP cookieです。
関係ないですが食べる方のクッキーは大好きです。
が、買おうとすると彼女が何故か嫌がるので買えないんですよね・・・・・・。
Laravelではこのクッキーの取り扱いが
簡単に見えて実はめんどくさいんですよ。
何がめんどくさいかって
クッキーをセットした上でリダイレクトっていうのを実装できないことなんですよ。
(追記)できました。(#57)
単に僕の知識不足かも知れませんが、どうググってもそれらしいメソッドはないんですね。
APIも一応参照しましたが、それらしきものは見つからず・・・・・・。
ということで、僕が実装したのは下のような形です。
$response=response('<meta http-equiv="refresh" content="0 ; URL=./">',200);
//クッキーに保存
foreach(self::$names as $name){
if($name=="preview"){//previweはチェックボックスのため他と保存方法を変える必要がある
if(isset($request[$name])){
$response=$response->withCookie(cookie( $name, $request[$name]));
}else{
$response=$response->withCookie(cookie()->forever( $name, ""));
}
}else{
$response=$response->withCookie(cookie()->forever( $name, $request[$name]));
}
}
$response=$response->withCookie(cookie()->forever( "visited", "visited"));
return $response;
1行目で、タイプヒントにより得たResponse型の$responseに、内容として
METAタグを埋め込みます。
出力される文書はHTMLではありませんが、METAタグをブラウザが解釈することで強制的にリダイレクトさせることができるわけですね。
で、この$responseにクッキーを埋め込みます。後々開発しやすいようにforeachで回しています。
ちなみに、普通に書き並べるだけなら
いちいちMETAタグなんかつけなくても実装できます。
このforeachで回す必要があるがために、チェーンでクッキーをセットできなかったんですね。
で、最終的に出来上がった$responseをリターンすることで、セットされたメタタグが読み込まれ、結果的にリダイレクトされ、かつクッキーもセットすることができます。
これが賢い方法だとは思わないんですが、僕の持ってる知識ではこれが限界です。
APIとか見ても、それらしいメソッドが存在しないし、クッキーをセットする以上returnするのはResponse型でなくてはいけないので、お手上げです。
これで動かないブラウザがあった場合
僕はリアルに泣きます。
$response=response('<html><head><meta http-equiv="refresh" content="0 ; URL=./"></head></html>',200);
苦し紛れにこんな形にしてみました。コンテントをHTMLにすれば、とりあえずどんなブラウザでも正常に動くでしょう。
でも正直苦し紛れなんで、もっといい手法があったらいいのになあと。まぁ、Laravelのセキュアなクッキーを使うにはこうする他ないのだということで、今のところはそう認識しておきましょう。
とりあえず一週間近く悩んだこの話題について解決はできたので安心しました。
クッキーの読み出しに関してはめちゃくちゃ簡単なのでこっちで解説などはしないつもりです。
次こそページネーションの話ができるといいなあと思ってます。