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

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

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

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

PHP

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

Q&A

解決済

1回答

4021閲覧

【Laravel】ログイン済みと未ログインで別のviewを見せたい

nakamu

総合スコア82

Laravel

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

PHP

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

0グッド

0クリップ

投稿2021/04/04 18:42

編集2021/04/05 02:25

なぜか認証済みのトップページへのルーティングを加えるとエラーになる
Route [login] not defined.

グループで別れてるのにはずなのになぜ?

Laravel

1Route::group(['middleware' => ['guest']], function () { 2 Route::get("/", "Auth\AuthController@index"); 3 Route::post('/login', 'Auth\AuthController@login'); 4}); 5 6Route::group(['middleware' => ['auth']], function () { 7 // これが入るとエラーになる 8 Route::get('/', function () { 9 return view('welcome'); 10 }); 11});

追記ルーティングリスト
+--------+----------+----------+------+------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+----------+------+------------------------------------------------+------------+
| | GET|HEAD | / | | Closure | web |
| | | | | | auth |
| | GET|HEAD | api/user | | Closure | api |
| | | | | | auth:api |
| | POST | login | | App\Http\Controllers\Auth\AuthController@login | web |
| | | | | | guest |
+--------+----------+----------+------+------------------------------------------------+------------+

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

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

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

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

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

m.ts10806

2021/04/04 21:45

login を受けるルーティングがないからでは。 提示されたコードが全てならですが。
Lulucom

2021/04/04 23:45 編集

ルーティングを確認するコマンドの結果も質問本文へ掲載されると良いかなと思いました。 php artisan route:list
nakamu

2021/04/05 02:30

Route::get("/", "Auth\AuthController@index")->name('login'); 名前つけてもうまくいかないです
m.ts10806

2021/04/05 02:54

問題が出てるのは/loginでは。
m.ts10806

2021/04/05 02:55

ドキュメント確認されたら分かりますか、nameに入れるのはエイリアスです。
nakamu

2021/04/05 03:23

m.ts10806さんのおっしゃるようにエイリアスなので、Authenticate.phpのredirectToをreturn route('login.index');のようにし、guest内のルートを->name('login.index');とすると、Route [login.index] not defined.となります。 回答に対するコメントでも同じことをお聞きさせて頂いたんですが、同じURIが存在するがために今回のエラーが発生しています。最初に同時にミドルウェアが実行されたがために['auth']の方でloginにリダイレクトされましたが、既にguest側のミドルウェアが実行済みなので発動しないような状況でしょうか?
Lulucom

2021/04/06 00:38 編集

php artisan route:list コマンドの結果を追記してくださってありがとうございます。ただ、少し見づらいのでMarkdown記法を使って整形していただければと思います。 あと、routes/web.phpファイルで ->name('login') のようにルートに名前を付けた場合、php artisan route:list コマンドの結果の表で Name 列にその名前は表示されますか?もし、表示されない場合はroutes/web.phpファイルの変更が反映されていないと考えられます。その場合は php artisan route:clear コマンドを実行すると反映されますか?
guest

回答1

0

ベストアンサー

php

1Route::get("/login", "Auth\AuthController@index")->name('login'); 2Route::post('/login', 'Auth\AuthController@login'); 3 4 5Route::group(['middleware' => ['auth']], function () { 6 Route::get('/', function () { 7 return view('welcome'); 8 }); 9});

やりたいことを実現するだけなら上のコードです。
Laravelのrouteでログインしているかしていないかで同じURIの別のviewを表示するのは諦めましょう。
もしどうしてもそうしたいならControllerでログインしているかを判断してreturnするviewを分岐させましょう。

以下補足
~~ Laravelのrouteは基本先勝ち(コードで上に書いてあるURIを優先する)なのですが、2つ同じURIがある場合は振り分けられる前に両方のmiddlewareの処理が走ります。~~

今回のケースですと['middleware' => ['auth']]の処理が走り、ログインしてないのでログインページ(route('login'))へリダイレクトしようとしています。

今回はそれに加えてログインページのrouteが定義されてませんので、Route [login] not defined.のエラーとなります。

内部コードを追っていたら上の説明が間違っていたため追記します。

まずLaravelはweb.phpのようなrouteファイルをもとに、routing list を作成します。(追記で貼ってくださったやつ)
そのrouting listの作成はgroupを1つづつ処理した後にそれらをmergeしてるのですが、
違うgroupで同じuriが設定されていることは考慮されていません。
つまり後から書かれたgroupに前に書かれたgroupで定義されたrouteと同じuriがある場合は上書きされます。

その後、アクセスしたurlに合っているrouteを決定するために、作成したrouting list を上から見ていき、合致したものがあった場合はそのrouteのactionを実行します。(通常はControllerの指定したfunction)
このrouting list を上から見ていく処理がLaravelのrouteは先勝ちと言った部分の処理であり、
routing listを作成する処理は後勝ちでした。

同じuriを使った別groupのrouteは、後に書かれたものしかrouteに登録されませんので
uriが被らないようにrouteを設定しましょう。

投稿2021/04/05 01:46

編集2021/04/05 05:47
kaya754

総合スコア133

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

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

nakamu

2021/04/05 03:10

>>>今回のケースですと['middleware' => ['auth']]の処理が走り、ログインしてないのでログインページ(route('login'))へリダイレクトしようとしています。 こちらは、Middleware/Authenticate.phpのredirectToで定義されているやつですね。 >両方のmiddlewareの処理が走ります。 ということは両方走って、コードを書いた順番的には、guestの方が上ですが、先に['auth']の方が実行されて(route('login'))へリダイレクトしたということですね。 >Route::get("/", "Auth\AuthController@index")->name('login'); こちらのようにURIはそのままにguestでloginの名前をつけても同じエラーが出てしまう理由としては、同じURIでミドルウェアが最初に両方実行してしまったので、リダイレクト後にguestのルーティングが行われないがためということでしょうか?
kaya754

2021/04/05 04:10

Laravelのrouteに関する内部コードを追っていたら回答で言っていることがどうも間違っているようなので追記します。
nakamu

2021/04/06 13:19

kaya754さんありがとうございます! 基本的なnameの部分からかなり深ぼったところまで理解できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問