ついに・・・・・・発生してしまった・・・・・・。
そう、
非ロジックなバグです。
ロジックとは関係ない、つまり
サーバーとかフレームワーク側の仕様に振り回される形で出てくるバグですね。
今のところ以下の2点に苦しめられています。
1.DB更新がビューに即時反映されない(キャッシュなのか...?)
2.たまに遷移ボタンがバグる(route関数がおかしいのか?)
1に関しては、プロフィールを更新した後にプロフィール画面に戻るのですが、そこで更新が反映されてないんですよね。
ユーザーインスタンスの値が更新されていない可能性が示唆されますね。
ホスト情報を格納しているインスタンスは、実はプロフィール画面においてはユーザー情報のコピーなんですよね。同じ情報の参照なのにわざわざもう一回DBにアクセスする意味が分かりませんからね。
ということで、強引に再読込させることにしてみました。
DB::table('users')
->where('id', Auth::user()->id)
->update([
'price' => $request["price"],
'sex_validate' => $request["sex_validate"],
'is_Sunday' => $request["is_Sunday"],
'is_Monday' => $request["is_Monday"],
'is_Tuesday' => $request["is_Tuesday"],
'is_Wednesday' => $request["is_Wednesday"],
'is_Thursday' => $request["is_Thursday"],
'is_Friday' => $request["is_Friday"],
'is_Saturday' => $request["is_Saturday"],
'checkin_start' => array_to_time([$request["check_in_start_hour"],$request["check_in_start_minute"]]),
'checkin_finish' => array_to_time([$request["check_in_finish_hour"],$request["check_in_finish_minute"]]),
'checkout_start' => array_to_time([$request["check_out_start_hour"],$request["check_out_start_minute"]]),
'checkout_finish' => array_to_time([$request["check_out_finish_hour"],$request["check_out_finish_minute"]]),
'max_member' => $request["max_member"],
'house_pr' => $request["house_pr"],
'option_breakfast' => $request["option_breakfast"],
'option_dinner' => $request["option_dinner"],
'option_bath' => $request["option_bath"],
'option_smoking' => $request["option_smoking"],
'option_pickup' => $request["option_pickup"],
'option_exp' => $request["option_exp"],
]);
return view('Profile.index')->with('reload',true);
DB更新後、ビューに"reload"っていう論理値を強引に渡します。
@php
if(isset($reload)){
$host = new App\Classes\Host($user->id,true);
}
@endphp
Hostクラスってのを勝手に作ってるので、$hostをnewして上書きします。第二引数にtrueなんてのがくっついてるのがミソですね。
public function __construct($userid,$reload=false)
{
if($userid == Auth::user()->id && $reload===false){
//現在ログインしているユーザー = DB接続不要
$userinstance = Auth::user();//参照コピー
}else{
//IDのみが送られる or 別ユーザーの情報取得 時、DBアクセス
$userinstance = DB::table('users')->where('id', $userid)->first();
}
...
で、こんな感じに退避処理を挟み込んでみました。
すると
ちゃんと動いたわけですね。
まぁ考えてみれば当然かもしれません。ユーザーインスタンスも結局
Auth::user()で取ってきてるんですが、ここの情報はコントローラーでも使える、つまりコントローラーとビューの間でユーザーカラムが更新されたところでわざわざ再読込とかするわけないので、昔の値を参照したままの状態になっているんですね。
リロードすると更新されるということは、やはりアクセスした瞬間毎回ユーザーテーブルに問い合わせをしていることがわかりますね。なるほどマン。
まぁこの問題に関しては解決したので良しとしましょう。
問題は2だ。
タイミングによってリンク先が変わるというのは
どう考えてもこっちの都合じゃないので、原因解明を急がなくてはなりません。
(追記)
あ、原因わかりました。アドレスです。
アドレスが違うけどビューが同じ、って時に発生するみたいですね。back()の戻り先が、純粋に「一つ前に戻る」でしかないため起きるバグみたいです。
なので、素直にリダイレクトしましょ。それで解決します。