質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

2895閲覧

Laravelで$request->session()->forget()が効かない

spell

総合スコア16

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/11/12 06:56

編集2018/11/12 06:57

前提・実現したいこと

Laravel 5.7でサイトを構築しておりsessionはmemcachedに保存しています。
データを登録・編集する機能を作成中なのですが、
確認画面のコントローラーで

php

1 $request->session()->put( 'execute', true );

とし、完了画面で

php

1 if( $request->session()->has( 'execute' ) ) { 2 Model::hogeSave( $request->all() ); 3 $request->session()->forget( 'execute' ); 4 }

として、リロード対策を行おうとしています。

発生している問題・エラーメッセージ

完了画面でreloadを行うと意図した動きとしては

php

1$request->session()->has( 'execute' ) === false

になるはずですが、dumpしてみても
$request->session()->get( 'execute' )が存在しており、forgetが効いていません。
forgetが効くようにするためには、何処を確認したらよいでしょうか。

試したこと

Illuminate\Support\Facades\Session;
のSessionを試してみましたが、同じ状態でexecuteのキーが存在したままになります。

補足情報(FW/ツールのバージョンなど)

Cent OS 7.3
Apache 2.4.6
php 7.2.11

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mix-peach

2018/11/12 09:44

「dumpしてみても $request->session()->get( 'execute' )が存在しており、forgetが効いていません。」というのは、どのように確認されたのでしょう?実際にリロードしてみたら、処理が2回実行された・・ということですか?
spell

2018/11/13 00:38

はい、リロードしてみると更新処理が走り更新時間が変更されていました。
mix-peach

2018/11/13 01:52

リロードしたのは、「完了画面」のような、viewなどでレスポンスを正しく返却した画面ですか?
spell

2018/11/13 04:58

完了画面がリロードされています。 viewをreturn する前に var_dumpで$request()->session->get( 'execute' )を確認しました。
spell

2018/11/13 04:59

$request->session()->forget( 'execute' );の後に$request->session()->save();をする事で意図した動きになる事が確認できましたが、putの際はsaveしなくても$request->session()に値がセットされるのは謎ですが・・・。
guest

回答1

0

自己解決

php

1$request->session()->forget( 'execute' ); 2の後に 3$request->session()->save(); 4 5を追加する事で、forget()が効くようになり意図した動きを確認できました。

$request->session()->put( 'hoge', 'fuga' );

$request->session()->save();
を行っていないのに反映されているのは気になるところですが、一旦今回の問題はクリアになりました。

投稿2018/11/13 05:03

spell

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mix-peach

2018/11/13 05:41

laravelは、sessionの反映タイミングが微妙(レスポンスを返した後とか)なので、そこが原因かな?と思ったのですが、違ったようですね。 私の手元の環境はちょっとlaravelが古いのと、memcachedではないので参考にならないですが、saveしなくても正常に削除されていました。。。なので、laravelのバージョンか、あるいはsessionの保存先によって、追加・削除の挙動が変わる部分があるのかもしれません。(保存先で挙動が変わるのは困った話ですが;) もし、1リクエスト間でいいのであれば、flashを使うのもいいかもしれません。 あとは、putがsaveしなくても反映されるのであれば、pullなら削除がうまくいったりするかもしれないですね(想像) とりあえずは、解決できたようでよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問