teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

改行位置変更

2021/04/05 05:47

投稿

kaya754
kaya754

スコア133

answer CHANGED
@@ -30,6 +30,8 @@
30
30
  つまり後から書かれたgroupに前に書かれたgroupで定義されたrouteと同じuriがある場合は上書きされます。
31
31
 
32
32
  その後、アクセスしたurlに合っているrouteを決定するために、作成したrouting list を上から見ていき、合致したものがあった場合はそのrouteのactionを実行します。(通常はControllerの指定したfunction)
33
- このrouting list を上から見ていくがLaravelのrouteは先勝ち部分であり、routing list 自体は後勝ちです。
33
+ このrouting list を上から見ていく処理がLaravelのrouteは先勝ちと言った部分の処理であり、
34
+ routing listを作成する処理は後勝ちでした。
34
35
 
35
- 同じuriを使った別groupのrouteは後に書かれたものしかrouteに登録されませんのでuriが被らないようにurlを設計しましょう。
36
+ 同じuriを使った別groupのrouteは後に書かれたものしかrouteに登録されませんので
37
+ uriが被らないようにrouteを設定しましょう。

4

Laravelのrouteの内部処理について追記

2021/04/05 05:47

投稿

kaya754
kaya754

スコア133

answer CHANGED
@@ -14,8 +14,22 @@
14
14
  もしどうしてもそうしたいならControllerでログインしているかを判断してreturnするviewを分岐させましょう。
15
15
 
16
16
  以下補足
17
- Laravelのrouteは基本先勝ち(コードで上に書いてあるURIを優先する)なのですが、2つ同じURIがある場合は振り分けられる前に両方のmiddlewareの処理が走ります。
17
+ ~~ Laravelのrouteは基本先勝ち(コードで上に書いてあるURIを優先する)なのですが、2つ同じURIがある場合は振り分けられる前に両方のmiddlewareの処理が走ります。~~
18
18
 
19
19
  今回のケースですと['middleware' => ['auth']]の処理が走り、ログインしてないのでログインページ(route('login'))へリダイレクトしようとしています。
20
20
 
21
- 今回はそれに加えてログインページのrouteが定義されてませんので、Route [login] not defined.のエラーとなります。
21
+ 今回はそれに加えてログインページのrouteが定義されてませんので、Route [login] not defined.のエラーとなります。
22
+
23
+
24
+
25
+ #### 内部コードを追っていたら上の説明が間違っていたため追記します。
26
+
27
+ まずLaravelはweb.phpのようなrouteファイルをもとに、routing list を作成します。(追記で貼ってくださったやつ)
28
+ そのrouting listの作成はgroupを1つづつ処理した後にそれらをmergeしてるのですが、
29
+ 違うgroupで同じuriが設定されていることは考慮されていません。
30
+ つまり後から書かれたgroupに前に書かれたgroupで定義されたrouteと同じuriがある場合は上書きされます。
31
+
32
+ その後、アクセスしたurlに合っているrouteを決定するために、作成したrouting list を上から見ていき、合致したものがあった場合はそのrouteのactionを実行します。(通常はControllerの指定したfunction)
33
+ このrouting list を上から見ていくが、Laravelのrouteは先勝ちの部分であり、routing list 自体は後勝ちです。
34
+
35
+ 同じuriを使った別groupのrouteは後に書かれたものしかrouteに登録されませんのでuriが被らないようにurlを設計しましょう。

3

結論を冒頭に持ってくるように変更

2021/04/05 04:22

投稿

kaya754
kaya754

スコア133

answer CHANGED
@@ -1,22 +1,21 @@
1
- Laravelのrouteは基本先勝ち(コードで上に書いてあるURIを優先する)なのですが、2つ同じURIがある場合は振り分けられる前に両方のmiddlewareの処理が走ります。
2
-
3
- 今回のケースですと['middleware' => ['auth']]の処理が走り、ログインしてないのでログインページ(route('login'))へリダイレクトしようとしています。
4
-
5
- 今回はそれに加えてログインページのrouteが定義されてませんので、Route [login] not defined.のエラーとなります。
6
-
7
1
  ```php
8
2
  Route::get("/login", "Auth\AuthController@index")->name('login');
9
3
  Route::post('/login', 'Auth\AuthController@login');
10
4
 
11
5
 
12
6
  Route::group(['middleware' => ['auth']], function () {
13
- // これが入るとエラーになる
14
7
  Route::get('/', function () {
15
8
  return view('welcome');
16
9
  });
17
10
  });
18
11
  ```
19
-
20
12
  やりたいことを実現するだけなら上のコードです。
21
13
  Laravelのrouteでログインしているかしていないかで同じURIの別のviewを表示するのは諦めましょう。
22
- もしどうしてもそうしたいならControllerでログインしているかを判断してreturnするviewを分岐させましょう。
14
+ もしどうしてもそうしたいならControllerでログインしているかを判断してreturnするviewを分岐させましょう。
15
+
16
+ 以下補足
17
+ Laravelのrouteは基本先勝ち(コードで上に書いてあるURIを優先する)なのですが、2つ同じURIがある場合は振り分けられる前に両方のmiddlewareの処理が走ります。
18
+
19
+ 今回のケースですと['middleware' => ['auth']]の処理が走り、ログインしてないのでログインページ(route('login'))へリダイレクトしようとしています。
20
+
21
+ 今回はそれに加えてログインページのrouteが定義されてませんので、Route [login] not defined.のエラーとなります。

2

文言を追加

2021/04/05 03:06

投稿

kaya754
kaya754

スコア133

answer CHANGED
@@ -17,4 +17,6 @@
17
17
  });
18
18
  ```
19
19
 
20
- やりたいことを実現するだけなら上のコードです。
20
+ やりたいことを実現するだけなら上のコードです。
21
+ Laravelのrouteでログインしているかしていないかで同じURIの別のviewを表示するのは諦めましょう。
22
+ もしどうしてもそうしたいならControllerでログインしているかを判断してreturnするviewを分岐させましょう。

1

具体的にどうすればいいかを追加

2021/04/05 01:53

投稿

kaya754
kaya754

スコア133

answer CHANGED
@@ -2,4 +2,19 @@
2
2
 
3
3
  今回のケースですと['middleware' => ['auth']]の処理が走り、ログインしてないのでログインページ(route('login'))へリダイレクトしようとしています。
4
4
 
5
- 今回はそれに加えてログインページのrouteが定義されてませんので、Route [login] not defined.のエラーとなります。
5
+ 今回はそれに加えてログインページのrouteが定義されてませんので、Route [login] not defined.のエラーとなります。
6
+
7
+ ```php
8
+ Route::get("/login", "Auth\AuthController@index")->name('login');
9
+ Route::post('/login', 'Auth\AuthController@login');
10
+
11
+
12
+ Route::group(['middleware' => ['auth']], function () {
13
+ // これが入るとエラーになる
14
+ Route::get('/', function () {
15
+ return view('welcome');
16
+ });
17
+ });
18
+ ```
19
+
20
+ やりたいことを実現するだけなら上のコードです。