回答編集履歴

15

修正

2019/04/07 09:57

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -52,31 +52,31 @@
52
52
 
53
53
 
54
54
 
55
- // デフォルトロケールまたは存在しないロケールならフォールバック
55
+ if ($lang !== null) {
56
56
 
57
- if (
58
57
 
59
- $lang !== null
60
58
 
59
+ // デフォルトロケールまたは存在しないロケールならフォールバック
60
+
61
- && (
61
+ if (
62
62
 
63
63
  $lang === config('app.fallback_locale')
64
64
 
65
65
  || !in_array($lang, $this->possibleLocales, true)
66
66
 
67
- )
67
+ ) {
68
68
 
69
- ) {
69
+ return redirect()->route(substr($route->getName(), 5));
70
70
 
71
- return redirect()->route(substr($route->getName(), 5));
72
-
73
- }
71
+ }
74
72
 
75
73
 
76
74
 
77
- // ロケールの設定
75
+ // ロケールの設定
78
76
 
79
- App::setLocale($lang);
77
+ App::setLocale($lang);
78
+
79
+ }
80
80
 
81
81
 
82
82
 

14

修正

2019/04/07 09:57

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -56,9 +56,15 @@
56
56
 
57
57
  if (
58
58
 
59
- $lang === config('app.fallback_locale')
59
+ $lang !== null
60
60
 
61
+ && (
62
+
63
+ $lang === config('app.fallback_locale')
64
+
61
- || !in_array($lang, $this->possibleLocales, true)
65
+ || !in_array($lang, $this->possibleLocales, true)
66
+
67
+ )
62
68
 
63
69
  ) {
64
70
 

13

フォールバック設定

2019/04/07 09:56

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -38,19 +38,39 @@
38
38
 
39
39
  {
40
40
 
41
+ protected $possibleLocales = ['ja', 'en', 'cn', 'ru'];
42
+
43
+
44
+
41
45
  public function handle(Request $request, Closure $next)
42
46
 
43
47
  {
44
48
 
49
+ $route = $request->route();
50
+
45
- $lang = $request->route('lang');
51
+ $lang = $route->parameter('lang');
46
52
 
47
53
 
48
54
 
49
- if ($lang) {
55
+ // デフォルトロケールまたは存在しないロケールならフォールバック
50
56
 
57
+ if (
58
+
51
- App::setLocale($lang);
59
+ $lang === config('app.fallback_locale')
60
+
61
+ || !in_array($lang, $this->possibleLocales, true)
62
+
63
+ ) {
64
+
65
+ return redirect()->route(substr($route->getName(), 5));
52
66
 
53
67
  }
68
+
69
+
70
+
71
+ // ロケールの設定
72
+
73
+ App::setLocale($lang);
54
74
 
55
75
 
56
76
 

12

修正

2019/04/07 09:55

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -122,11 +122,7 @@
122
122
 
123
123
  return route(
124
124
 
125
- $params['lang'] === config('app.fallback_locale')
125
+ $params['lang'] === config('app.fallback_locale') ? $name : "lang.$name",
126
-
127
- ? $name
128
-
129
- : "$params[lang].$name",
130
126
 
131
127
  $params
132
128
 

11

リファクタ

2019/04/07 09:41

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -116,15 +116,19 @@
116
116
 
117
117
  {
118
118
 
119
- $lang = $params['lang'] ?? App::getLocale();
119
+ $params['lang'] += App::getLocale();
120
120
 
121
121
 
122
122
 
123
123
  return route(
124
124
 
125
- $lang === config('app.fallback_locale') ? $name : "$lang.$name",
125
+ $params['lang'] === config('app.fallback_locale')
126
126
 
127
+ ? $name
128
+
127
- $params + compact('lang')
129
+ : "$params[lang].$name",
130
+
131
+ $params
128
132
 
129
133
  );
130
134
 

10

修正

2019/04/07 09:40

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -159,3 +159,7 @@
159
159
 
160
160
 
161
161
  これで `route_i18n` を使って定義するのはどうでしょうか?現在表示しているページの言語にあったルーティングを暗黙的に書けます。言語を切り替えるときもそれを `$params` に渡せば、引数のほうが優先されるので問題ありません。
162
+
163
+
164
+
165
+ 中身の多言語化に関しては通常どおり `__` 関数を使うだけですね。とても簡単です。

9

修正

2019/04/07 09:36

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -122,7 +122,7 @@
122
122
 
123
123
  return route(
124
124
 
125
- $lang === config('fallback_locale') ? $name : "$lang.$name",
125
+ $lang === config('app.fallback_locale') ? $name : "$lang.$name",
126
126
 
127
127
  $params + compact('lang')
128
128
 

8

リファクタ

2019/04/07 09:33

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -24,11 +24,117 @@
24
24
 
25
25
 
26
26
 
27
- # 対策
27
+ # 実装方針
28
28
 
29
29
 
30
30
 
31
+ #### ミドルウェアの作成
32
+
33
+
34
+
35
+ ```php
36
+
37
+ class LocaleMiddleware
38
+
39
+ {
40
+
41
+ public function handle(Request $request, Closure $next)
42
+
43
+ {
44
+
45
+ $lang = $request->route('lang');
46
+
47
+
48
+
49
+ if ($lang) {
50
+
51
+ App::setLocale($lang);
52
+
53
+ }
54
+
55
+
56
+
57
+ return $next($request);
58
+
59
+ }
60
+
61
+ }
62
+
63
+ ```
64
+
65
+
66
+
67
+ #### ルーティング定義
68
+
69
+
70
+
71
+ ルーティング定義は以下のようになります。
72
+
73
+
74
+
75
+ ```php
76
+
77
+ // デフォルト言語
78
+
79
+ Route::namespace('App\Http\Controllers')
80
+
81
+ ->group(base_path('routes/localized.php'));
82
+
83
+
84
+
85
+ // 各言語
86
+
87
+ Route::namespace('App\Http\Controllers')
88
+
89
+ ->middleware(LocaleMiddleware::class)
90
+
91
+ ->prefix('{lang}')
92
+
93
+ ->as('lang.')
94
+
95
+ ->group(base_path('routes/localized.php'));
96
+
97
+ ```
98
+
99
+
100
+
101
+ アプリケーションの実際の定義は `routes/localized.php` に書いてください。
102
+
103
+
104
+
105
+ #### ヘルパー関数の作成
106
+
107
+
108
+
109
+ 以下のようなヘルパー関数を適当な場所に定義してください。
110
+
111
+
112
+
113
+ ```php
114
+
115
+ function route_i18n(string $name, array $params): string
116
+
117
+ {
118
+
119
+ $lang = $params['lang'] ?? App::getLocale();
120
+
121
+
122
+
123
+ return route(
124
+
125
+ $lang === config('fallback_locale') ? $name : "$lang.$name",
126
+
127
+ $params + compact('lang')
128
+
129
+ );
130
+
131
+ }
132
+
133
+ ```
134
+
135
+
136
+
31
- 以下のようなヘルパー関数を適当な場所に定義してください。`app/helpers.php` を作って composer.json の `autoload` の `files` に書くのがおすすめです。
137
+ `app/helpers.php` を作って composer.json の `autoload` の `files` に書くのがおすすめです。
32
138
 
33
139
 
34
140
 
@@ -48,55 +154,7 @@
48
154
 
49
155
 
50
156
 
51
- ```php
52
-
53
- function route_i18n(string $name, array $params): string
54
-
55
- {
56
-
57
- $lang = $params['lang'] ?? request()->route('lang');
58
-
59
-
60
-
61
- return route(
62
-
63
- $lang ? $name : "$lang.$name",
64
-
65
- $lang ? $params + compact('lang') : $params
66
-
67
- );
68
-
69
- }
70
-
71
- ```
157
+ ----
72
-
73
-
74
-
75
- ルーティング定義は以下のようになります。アプリケーションの実際の定義は `routes/localized.php` に書いてください。
76
-
77
-
78
-
79
- ```php
80
-
81
- // デフォルト言語
82
-
83
- Route::namespace('App\Http\Controllers')
84
-
85
- ->group(base_path('routes/localized.php'));
86
-
87
-
88
-
89
- // 各言語
90
-
91
- Route::prefix('{lang}')
92
-
93
- ->as('lang.')
94
-
95
- ->namespace('App\Http\Controllers')
96
-
97
- ->group(base_path('routes/localized.php'));
98
-
99
- ```
100
158
 
101
159
 
102
160
 

7

まとめ

2019/04/07 09:31

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -1,56 +1,50 @@
1
- 質問文から判断する限りではメソッド引数に何も影響は無いように思います。`$lang` は受け取ることもできますが、受け取らなくてもいいはず。
1
+ # 概要
2
2
 
3
3
 
4
4
 
5
- ---
5
+ エラーが出る原因は
6
6
 
7
7
 
8
8
 
9
- ```php
9
+ - ルーティングされるメソッドに `$lang` が定義されていない
10
10
 
11
- Route::prefix('{lang}')
12
11
 
13
- ->namespace('App\Http\Controllers')
14
12
 
15
- ->group(function () {
13
+ からではなく
16
14
 
17
- Route::get('example', 'ExampleController@index');
18
15
 
16
+
17
+ - ルーティングリンク生成時に `{lang}` が含まれるほうを利用している
18
+
19
+ - にも関わらず、`["lang" => $lang]` をパラメータに渡していない
20
+
21
+
22
+
23
+ が原因かと思われます。
24
+
25
+
26
+
19
- });
27
+ # 対策
28
+
29
+
30
+
31
+ 以下のようなヘルパー関数を適当な場所に定義してください。`app/helpers.php` を作って composer.json の `autoload` の `files` に書くのがおすすめです。
32
+
33
+
20
34
 
21
35
  ```
22
36
 
23
-
24
-
25
- ```php
26
-
27
- class ExampleController extends Controller
28
-
29
37
  {
30
38
 
31
- public function index()
39
+ "autoload": {
32
40
 
33
- {
34
-
35
- return 'working fine';
41
+ "files": ["app/helpers.php"]
36
42
 
37
43
  }
38
44
 
39
45
  }
40
46
 
41
47
  ```
42
-
43
-
44
-
45
- これで `/en/example` でアクセスして動きました
46
-
47
-
48
-
49
- ----
50
-
51
-
52
-
53
- ヘルパー関数↓
54
48
 
55
49
 
56
50
 
@@ -78,7 +72,7 @@
78
72
 
79
73
 
80
74
 
81
- ルーティング定義実際の定義は `routes/localized.php` に書く)↓
75
+ ルーティング定義は以下のようになります。アプリケーションの実際の定義は `routes/localized.php` に書いてださい。
82
76
 
83
77
 
84
78
 

6

訂正

2019/04/07 09:14

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -62,11 +62,15 @@
62
62
 
63
63
  $lang = $params['lang'] ?? request()->route('lang');
64
64
 
65
- $route = $lang ? $name : "$lang.$name";
66
65
 
67
66
 
67
+ return route(
68
68
 
69
+ $lang ? $name : "$lang.$name",
70
+
69
- return route($route, $params + compact('lang'));
71
+ $lang ? $params + compact('lang') : $params
72
+
73
+ );
70
74
 
71
75
  }
72
76
 

5

訂正

2019/04/07 09:07

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -62,15 +62,11 @@
62
62
 
63
63
  $lang = $params['lang'] ?? request()->route('lang');
64
64
 
65
-
66
-
67
65
  $route = $lang ? $name : "$lang.$name";
68
-
69
- $params += $lang ? compact('lang') : [];
70
66
 
71
67
 
72
68
 
73
- return route($route, $params);
69
+ return route($route, $params + compact('lang'));
74
70
 
75
71
  }
76
72
 

4

訂正

2019/04/07 09:03

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -60,7 +60,7 @@
60
60
 
61
61
  {
62
62
 
63
- $lang = request()->route('lang');
63
+ $lang = $params['lang'] ?? request()->route('lang');
64
64
 
65
65
 
66
66
 

3

修正

2019/04/07 09:01

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -106,4 +106,4 @@
106
106
 
107
107
 
108
108
 
109
- これで `route_i18n` を使って定義するのはどうでしょうか?
109
+ これで `route_i18n` を使って定義するのはどうでしょうか?現在表示しているページの言語にあったルーティングを暗黙的に書けます。言語を切り替えるときもそれを `$params` に渡せば、引数のほうが優先されるので問題ありません。

2

編集

2019/04/07 09:00

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -43,3 +43,67 @@
43
43
 
44
44
 
45
45
  これで `/en/example` でアクセスして動きました
46
+
47
+
48
+
49
+ ----
50
+
51
+
52
+
53
+ ヘルパー関数↓
54
+
55
+
56
+
57
+ ```php
58
+
59
+ function route_i18n(string $name, array $params): string
60
+
61
+ {
62
+
63
+ $lang = request()->route('lang');
64
+
65
+
66
+
67
+ $route = $lang ? $name : "$lang.$name";
68
+
69
+ $params += $lang ? compact('lang') : [];
70
+
71
+
72
+
73
+ return route($route, $params);
74
+
75
+ }
76
+
77
+ ```
78
+
79
+
80
+
81
+ ルーティング定義(実際の定義は `routes/localized.php` に書く)↓
82
+
83
+
84
+
85
+ ```php
86
+
87
+ // デフォルト言語
88
+
89
+ Route::namespace('App\Http\Controllers')
90
+
91
+ ->group(base_path('routes/localized.php'));
92
+
93
+
94
+
95
+ // 各言語
96
+
97
+ Route::prefix('{lang}')
98
+
99
+ ->as('lang.')
100
+
101
+ ->namespace('App\Http\Controllers')
102
+
103
+ ->group(base_path('routes/localized.php'));
104
+
105
+ ```
106
+
107
+
108
+
109
+ これで `route_i18n` を使って定義するのはどうでしょうか?

1

2019/04/07 08:58

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -1 +1,45 @@
1
1
  質問文から判断する限りではメソッド引数に何も影響は無いように思います。`$lang` は受け取ることもできますが、受け取らなくてもいいはず。
2
+
3
+
4
+
5
+ ---
6
+
7
+
8
+
9
+ ```php
10
+
11
+ Route::prefix('{lang}')
12
+
13
+ ->namespace('App\Http\Controllers')
14
+
15
+ ->group(function () {
16
+
17
+ Route::get('example', 'ExampleController@index');
18
+
19
+ });
20
+
21
+ ```
22
+
23
+
24
+
25
+ ```php
26
+
27
+ class ExampleController extends Controller
28
+
29
+ {
30
+
31
+ public function index()
32
+
33
+ {
34
+
35
+ return 'working fine';
36
+
37
+ }
38
+
39
+ }
40
+
41
+ ```
42
+
43
+
44
+
45
+ これで `/en/example` でアクセスして動きました