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

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

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

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

Q&A

解決済

2回答

595閲覧

多言語サイト作成時の route ファイルの書き方について

pectin

総合スコア95

Laravel

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

0グッド

1クリップ

投稿2023/01/07 02:36

日本語と英語で表示する web ページを作成しています。

例えば、
https://website/grand/top は日本語
https://website/en/grand/top は英語
で表示するような構成の場合、同じコントローラで表示に使う blade ファイルを分別するような仕組みを考えています。
最初から言語切り替えがあるような仕様で設計されていればよかったのですが、都合によりこのような形で設計せざるを得ない状況です。

/grand/top のコントローラは日英同じで、view() で呼び出す blade ファイルを
日本語は top.blade.php
英語は top_en.blade.php
指定する形を取ろうと考えています。
こうすることで、同一コントローラで表示する blade ファイルだけ切り替えることが実現できると考えております。
lang ファイルに日本語と英語を用意して対応する方法もありますが、これも事情があって呼び出す blade ファイルを切り替える方式にせざるを得ない状況です。

切り替えに使うための値は setLocale() でセットした値で判断する考えです。
setLocale() にセットする値は、$request->fullUrl() などから正規表現で en が含まれれば英語、そうでなければ日本語とする Middleware を作成する考えです。

そこで教えていただきたいことがあります。

route ファイルで
Route::get('/grand/top', 'Grand\TopController@index');
Route::get('/en/grand/top', 'Grand\TopController@index');
と書けば同じコントローラが呼び出せますが、この書き方だと日本語が 100 行ある場合、似たような書き方をした英語も 100 行用意するのことなるので、この記述をもっと簡潔に書ける方法があれば知りたいです。

似たようなことを解決された方がいらっしゃるようでしたら、教えていただけますでしょうか。
よろしくお願いします。

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

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

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

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

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

yuma.inaura

2023/01/07 03:16

100行って文章のことなんでしょうか?
yuma.inaura

2023/01/07 03:29

ルートファイルの行数ってことですね
pectin

2023/01/07 04:44

はい、そうですね。 説明がわかりづらくてすみませんでした。
guest

回答2

0

ベストアンサー

自分だったらこうしますね。

routes/web.php

php

1 2$defaultRoutes = function () { 3 Route::get('top', TopController::class)->name('top'); 4 // その他のルーティングはここに追記してゆく 5}; 6 7Route::middleware(['auth', 'verified'])->group($defaultRoutes); 8Route::middleware(['auth', 'verified'])->prefix('{lang}')->group($defaultRoutes);

php

1<?php 2 3namespace App\Providers; 4 5use Illuminate\Cache\RateLimiting\Limit; 6use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; 7use Illuminate\Http\Request; 8use Illuminate\Support\Facades\App; 9use Illuminate\Support\Facades\RateLimiter; 10use Illuminate\Support\Facades\Route; 11 12class RouteServiceProvider extends ServiceProvider 13{ 14 /** 15 * The path to the "home" route for your application. 16 * 17 * Typically, users are redirected here after authentication. 18 * 19 * @var string 20 */ 21 public const HOME = '/dashboard'; 22 23 /** 24 * Define your route model bindings, pattern filters, and other route configuration. 25 * 26 * @return void 27 */ 28 public function boot() 29 { 30 $this->configureRateLimiting(); 31 32 $this->routes(function () { 33 Route::middleware('api') 34 ->prefix('api') 35 ->group(base_path('routes/api.php')); 36 37 Route::middleware('web') 38 ->group(base_path('routes/web.php')); 39 }); 40 41 Route::pattern('lang', 'ja|en'); // 対応する言語はここに記述して未対応の言語の時はエラーにする 42 43 // URL に指定された $lang の処理 44 Route::bind('lang', function ($lang = 'ja') { 45 App::setLocale($lang); // 規定の言語を設定する 46 App::viewPath($lang); // Bladeファイル の規定のパスを設定する 47 return $lang; 48 }); 49 } 50}

各コントローラからは以下のようにコールするだけで、ソースコードはスッキリする。

php

1class TopController extends Controller 2{ 3 public function index() 4 { 5 return view('top'); 6 } 7}

blade ファイルの配置

resources/views/top.blade.php resources/views/top_en.blade.php

ではなく、

resources/views/ja/top.blade.php resources/views/en/top.blade.php

にする。上の例だと、一つのディレクトリの中がファイルが増えるほどカオスになる。

投稿2023/01/07 06:46

編集2023/01/07 08:11
phper.k

総合スコア3923

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

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

pectin

2023/01/08 05:25

具体例を挙げていただきありがとうございました。 Laravel を勉強しながらですが、blade ファイルの参照パスを変更する方法が今回取り入れてみたいと思いました。 これであれば Controller 側はそのままで利用できるので改修がすごく楽になりそうです。 ServiceProvider については仕組みを理解していないので勉強しながら解釈してみたいと思います。
guest

0

てきとうにforeachしてはいかがでしょう

php

1$languages = array("", "en"); 2 3foreach ($languages as &$language) { 4 Route::get("{$language}/grand/top", 'Grand\TopController@index'); 5} 6

投稿2023/01/07 04:14

yuma.inaura

総合スコア1453

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

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

pectin

2023/01/07 04:49

$languages の配列初期値も setLocale() でセットした値から生成するなど工夫をすれば foreach すら不要になるかもしれないですね。 この視点は思いつきませんでした。 こちらを参考に工夫してみます! ありがとうございました!!
pectin

2023/01/08 05:21

すみません。 こちらの方法も良いのですが、より良い回答が得られたのでベストアンサーはその方にさせていただきますことをご容赦ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問