##環境
・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_ハッシュ値"というキーがユーザーを識別するためのものだという認識ですが間違っていますか?
このログを見る限りだとセッションは保持されていると思うのですが、何が問題なのでしょうか?
また、ログアウト処理をするAuthenticatedSessionController
のdestroy
アクションに下記のようにデバッグする箇所を仕込んでみました。
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 }
回答1件
あなたの回答
tips
プレビュー