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

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

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

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

Q&A

解決済

1回答

6501閲覧

Laravelでリクエストの値を取得できない

gasa

総合スコア4

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

0グッド

0クリップ

投稿2021/05/13 11:55

編集2021/05/15 04:09

##環境
・OS Windows
・php 7系
・Laravel8
・Laravelの認証はBreezeを使っています。
・セッション管理はdatabaseを使う設定になっています。

#解決したいこと
何度も同じような質問をしてごめんなさい。
もう5日くらい問題が解決せず困っています。

解決したいことは、ログアウトする際やPOSTでフォームの値を送信した際、Laravel側でリクエストのセッションやフォームの中身を取り出せないことです。

こちらの記事を参考にして、すべてのリクエストログはlaravel.logで確認できるようになっています。

具体的にログアウト出来ない問題というのは、ログイン後にログアウトリンクを踏むと、
Runtime Exeption Session store not set on request
と表示されるというものです。

このときのログは

[2021-05-13 20:18:31] local.DEBUG: POST {"url":"http://localhost/logout","request":{"_token":"ハッシュ値","_flash":{"old":[],"new":[]},"_previous":{"url":"http://localhost"},"url":{"intended":"http://localhost/"},"login_web_ハッシュ値":4}}

となっています。
"_token"というキーがcsrfトークンで、"login_web_ハッシュ値"というキーがユーザーを識別するためのものだという認識ですが間違っていますか?

このログを見る限りだとセッションは保持されていると思うのですが、何が問題なのでしょうか?

また、ログアウト処理をするAuthenticatedSessionControllerdestroyアクションに下記のようにデバッグする箇所を仕込んでみました。

public function destroy(Request $request) { Auth::logout(); logger($request->session()->all()); //ここにデバッグを仕込みました。 $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/'); }

するとログファイルには何も表示されませんでした。

デバッグする箇所を

public function destroy(Request $request) { logger($request->session()->all()); //ここにデバッグを仕込みました。 Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/'); }

このようにAuth::logout()の前に変えても、やはり何も出力されません。

しかし

public function destroy(Request $request) { logger(session('login_web_ハッシュ値')); //ここにデバッグを仕込みました。 Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/'); }

このようにphpのsessionヘルパを使うと値が取得できます。

Auth::loout()がどういった処理をしているのか理解できていないのですが、どうしてsessionがないことになるのでしょうか?
そもそもsessionがないのか、あるけれど取得できないのかさえも分かりません。

ログアウト以外にも、web.php

Route::post('/contacts', [コントローラ名::class, 'アクション名']);

というルーティングがあり、送信したフォームデータを取得してDBに保存する処理を書いたのですが、リクエストからフォームデータを取得できずエラーになります。

ログアウトのルーティングはmiddleware('auth')が指定されていますが、'/contacts'の方は指定されていません。
また、他のルーティングでもフォームデータを受け取る処理につながっているものがありますが、問題なく機能します。

なぜ一部の機能だけうまくリクエストを取得できないのでしょうか?

非常に冗長な説明になりましたが、何か心当たりがあればご教授頂きたいです。
よろしくお願いします。

<<追記>>
web.php

<?php use Illuminate\Support\Facades\Route; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\ChangeEmailController; use App\Http\Controllers\ChangePasswordController; use App\Http\Controllers\FollowController; use App\Http\Controllers\UserController; use App\Http\Controllers\HomeController; use App\Http\Controllers\LikeController; use App\Http\Controllers\ReviewController; use App\Http\Controllers\RankingController; use App\Http\Controllers\SchoolController; use App\Models\Review; use App\Events\MessageSent; use App\Events\CommentSent; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', [HomeController::class, 'index'])->name('top'); Route::get('/signup', [UserController::class, 'add'])->name('signup'); Route::post('/users/create', [UserController::class, 'create']); Route::get('/contact', [HomeController::class, 'showContactForm']); Route::post('/contact', [HomeController::class, 'receiveContact']); Route::middleware(['auth'])->group(function() { Route::get('/users', [UserController::class, 'index'])->name('mypage'); Route::get('/users/edit', [UserController::class, 'edit'])->name('user-edit'); Route::post('/users/update', [UserController::class, 'update'])->name('user-update'); Route::delete('/users/delete', [UserController::class, 'delete']); Route::get('/reviews/school/{school_id}', [ReviewController::class, 'showList']); Route::get('/reviews/review/{id}', [ReviewController::class, 'showReview']); Route::get('/reviews', [ReviewController::class, 'add']); Route::post('/reviews/create', [ReviewController::class, 'create']); Route::delete('/reviews/delete', [ReviewController::class, 'delete']); Route::get('/schools/{id}', [SchoolController::class, 'showSchool'])->name('school'); Route::get('/rankings', [RankingController::class, 'index'])->name('ranking'); Route::post('/rankings', [RankingController::class, 'showRanking']); Route::get('/follow/{id}', [FollowController::class, 'getCurrentStatus']); Route::post('/follow', [FollowController::class, 'switchFollow']); Route::get('/like/{id}', [LikeController::class, 'current']); Route::post('/like', [LikeController::class, 'switchLike']); Route::get('/password/change', [ChangePasswordController::class, 'showChangePasswordView']); Route::post('/password', [ChangePasswordController::class, 'changePassword']); Route::get('/email/edit', [ChangeEmailController::class, 'showChangeEmailForm']); Route::post('/email', [ChangeEmailController::class, 'sendChangeEmailLink'])->name('email'); Route::post('/email/reset', [ChangeEmailController::class, 'reset']); }); require __DIR__.'/auth.php';

app/Http/Kernel.php

<?php namespace App\Http; use App\Http\Middleware\RequestLogger; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { /** * The application's global HTTP middleware stack. * * These middleware are run during every request to your application. * * @var array */ protected $middleware = [ // \App\Http\Middleware\TrustHosts::class, \App\Http\Middleware\TrustProxies::class, \Fruitcake\Cors\HandleCors::class, \App\Http\Middleware\PreventRequestsDuringMaintenance::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, ]; /** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\RequestLogger::class, ], 'api' => [ 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ]; /** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, ]; }

<<追記2>>
エラー画面のDebugタブの内容を追記します。

Query Query select * from `sessions` where `id` = ? limit 1 Time 2.47 Connection name mysql 0 ハッシュ値 Query Query select * from `sessions` where `id` = ? limit 1 Time 0.67 Connection name mysql 0 1 Log Message POST Level debug url http://localhost/logout request { "_token": "ハッシュ値", "_flash": { "old": [], "new": [] }, "_previous": { "url": "http://localhost" }, "login_web_ハッシュ値": 1 }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/13 15:05

composer require laravel/breeze --dev ではじめましたかね? そうでなければ、サービスプロバイダとかあちこち点検しないといけない気がするけど。routes/web.phpとか、app/Http/Kernel.phpも示してもらわないと。
gasa

2021/05/13 17:09

ご返信ありがとうございます。 公式ドキュメント通りに composer require laravel/breeze --devでインストールしました。 composer.jsonのrequire-devにもlaravel/breezeがあるので間違いないと思います。 ただ、開発の途中でbreezeをインストールしたため、web.phpが上書きされてしまい、自分のgithubから復元したという経緯はあります。 ご指摘いただいた通りweb.phpとHttp/Kernel.phpを追記いたしましたのでご確認いただけると幸いです。
crhg

2021/05/13 23:06

エラーが発生したときにstack traceがログに出ているはずなのでそれを確認しましょう。 特に気になるのは * セッション情報を使おうとしているのは誰か * \Illuminate\Session\Middleware\StartSession ミドルウェアを経由しているか といったあたりです。
gasa

2021/05/14 09:36

コメントありがとうございます。 stack traceの内容は、 Illuminate\Http\Request::session vendor/laravel/framework/src/Illuminate/Http/Request.php:483 となっていて、483行目というのは以下です。 public function session() { if (! $this->hasSession()) { throw new RuntimeException('Session store not set on request.'); //483行目 } return $this->session; } * セッション情報を使おうとしているのは誰か についてですが、申し訳ありません。仰っていることが良くわかりません。理解力が足らず申し訳ありません。 * \Illuminate\Session\Middleware\StartSession ミドルウェアを経由しているか ですが、Http/Kernelの通りmiddlewareGroupsのwebの中に含まれているので経由していると思います。
crhg

2021/05/15 03:39

設定は正しそうなのにエラーが起きているんだから何か予想外のことが起きているわけで一番の手がかりがエラーログです。差し支えなければそのまま貼ってください。
gasa

2021/05/15 04:12

ありがとうございます。 エラー画面のDebugの内容を追記しましたのでご確認ください。 その後、データベースをすべてrollbackしてからmigrateし直したら、なぜか'/contacts'へpostした際のリクエストが取得できるようになりました。 ログアウトはやはりできません。
guest

回答1

0

自己解決

結局、別のdocker環境を作り、新規のlaravelプロジェクトを作成しました。
何が原因で問題が起きているかわからないので、手動で設定ファイル以外のファイルをコピーし、設定も恐る恐る元のファイルに近づけていくというやり方でログアウト出来ました!

解決と言えるやり方ではありまぜんが、現状は問題がなくなったので、これで解決としたいと思います。

ご助言を下さった方々、ありがとうございました。
原因を追究できるだけのスキルを身に着けられるよう精進したいと思います。

投稿2021/05/15 11:00

gasa

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問