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

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

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

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

Q&A

解決済

2回答

5657閲覧

Laravel route:listにルートが表示されない

mikeko0901

総合スコア227

Laravel

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

0グッド

0クリップ

投稿2021/03/14 14:13

Laravel8
php7.4
以下のサイトを参考に、マルチ認証を実装しています。
【Laravel Jetstream】複数モデルでログインできるようにする(Multi Auth)

userとは別にadminの認証を追加しました。

ほぼコピペでやったのですが、/adminにアクセスしても、userのログインページに遷移してしまいます。

php artisan route:list

をしてもadminのログインページを表示させる、MultiAuthControllerクラスのshowLoginFormが出てきません。。
アドバイスいただけますと幸いです。

/adminでアクセスしても
イメージ説明

user用のloginページに遷移してしまう。
イメージ説明

■ルート web.php

<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\MultiAuthController; use App\Http\Controllers\ProductController; Route::get('/', function () { return view('welcome'); }); Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () { return view('dashboard'); })->name('dashboard'); /* マルチ認証 */ //ログイン Route::get('admin', [\App\Http\Controllers\MultiAuthController::class, 'showLoginForm']); Route::post('admin', [\App\Http\Controllers\MultiAuthController::class, 'login']); // ログイン後 Route::prefix('admin')->middleware('auth:admins')->group(function(){ Route::get('/', [MultiAuthController::class, 'index'])->name('admin.index'); //商品登録 Route::get('/product/add', [ProductController::class, 'add'])->name('product.add'); });

■php artisan route:listの結果

-------+-----------------------------------------------------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+----------------------------------+---------------------------- | | GET|HEAD | / | | Closure | web | | | POST | admin | | App\Http\Controllers\MultiAuthController@login | web | | | GET|HEAD | admin | admin.index | App\Http\Controllers\MultiAuthController@index | web | | | | | | | App\Http\Middleware\Authenticate:admins | | | GET|HEAD | admin/product/add | product.add | App\Http\Controllers\ProductController@add | web | | | | | | | App\Http\Middleware\Authenticate:admins | | | GET|HEAD | api/user | | Closure | api | | | | | | | App\Http\Middleware\Authenticate:sanctum | | | GET|HEAD | dashboard | dashboard | Closure | web | +--------+----------+----------------------------------+----------------------------

文字数制限のため一部省略

MultiAuthControllerの、showLoginFormが出てきません…

こちらのキャッシュクリアコマンドは一通りやりましたが同じです。

■adminモデル app/Models/Admin.php

<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Auth\User as Authenticatable; //追加 class Admin extends Authenticatable //変更 Model⇒Authenticatable { use HasFactory; }

■config/auth.php

<?php return [ 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => false, ], //adminを追加 'admins' => [ 'driver' => 'session', 'provider' => 'admins', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], // 'users' => [ // 'driver' => 'database', // 'table' => 'users', // ], ], 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], ], 'password_timeout' => 10800, ];

■コントローラー MultiAuthController.php

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class MultiAuthController extends Controller { public function showLoginForm() { return view('admin.login'); } public function login(Request $request) { $credentials = $request->only(['email', 'password']); $guard = $request->guard; if(\Auth::guard($guard)->attempt($credentials)) { return view('admin.index'); } return back()->withErrors([ 'auth' => ['認証に失敗しました'] ]); } public function index() { return view('admin.index'); } }

■リダイレクトの設定 app/Http/Middleware/Authenticate.php

<?php namespace App\Http\Middleware; use Illuminate\Auth\Middleware\Authenticate as Middleware; use Illuminate\Support\Str; class Authenticate extends Middleware { protected function redirectTo($request) { if (! $request->expectsJson()) { $uri = $request->path(); // URIが以下から始まる場合 if(Str::startsWith($uri, ['admin/'])) { return 'admin'; } return route('login'); } } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

route.php

1 2//ログイン 3Route::get('admin', [\App\Http\Controllers\MultiAuthController::class, 'showLoginForm']); 4 5// ログイン後 6Route::prefix('admin')->middleware('auth:admins')->group(function(){ 7 Route::get('/', [MultiAuthController::class, 'index'])->name('admin.index');

この2つのrouteのURIがどちらも /admin であるため、route('admin.index') のmiddlewareで
adminログインチェックが入り、ログインしてないのでuserのログインページにリダイレクトしてますね。

Laravelのrouteは基本先勝ちなのですが、このケースだとmiddlewareのチェック発生するんですね。
既に変更なされてる通り、URIが被らないようにすると解消します。

投稿2021/03/15 01:45

編集2021/03/15 01:46
kaya754

総合スコア133

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

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

mikeko0901

2021/03/17 07:25

ありがとうございます。 Routeは先勝ちなのですね。先勝ちなのにmiddlewareのチェックがはいると勉強になりました。
guest

0

ルートを
Route::prefix('admin')->middleware('auth:admins')->group(function(){

Route::get('/index', [MultiAuthController::class, 'index'])->name('admin.index'); //商品登録 Route::get('/product/add', [ProductController::class, 'add'])->name('product.add');

});

に変更したら通りました。

投稿2021/03/14 14:56

mikeko0901

総合スコア227

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問