複数言語のWebサイト(Laravel 5.5)を作成しようとしています。したがって、私は、チュートリアルhttps://mydnic.be/post/how-to-build-an-efficient-and-seo-friendly-multilingual-architecture-for-your-laravel-applicationに従いますが、どういうわけか、私は言語のミドルウェア部分とのトラブルを持っている:Webミドルウェアが実行されない(Laravel 5.5)
// BeforeLanguage.php
namespace App\Http\Middleware;
use Closure;
class BeforeLanguage
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// Check if the first segment matches a language code
if (!array_key_exists($request->segment(1), config('translatable.locales'))) {
// Store segments in array
$segments = $request->segments();
// Set the default language code as the first segment
$segments = array_prepend($segments, config('app.fallback_locale'));
// Redirect to the correct url
return redirect()->to(implode('/', $segments));
}
return $next($request);
}
}
私は言語の識別子、EでURLを開く場合、それは動作します。 g。しかし、私は "申し訳ありませんが、あなたが探しているページが見つかりませんでした。 URIの言語識別子なしでページを開こうとすると、e。 g。 http://ps.dev/app/login
。
しかし、ここで私はミドルウェアがURIに言語セグメントを追加することを期待します。どんなアイデアが間違っているのでしょうか?
以下にいくつかの追加情報を提供したいと思います。 Laravelのドキュメントページによると、ミドルウェア・グループのウェブに割り当てられたミドルウェアがweb.php内で定義された任意の経路のために、デフォルトで実行されます
web.php
Route::prefix('app')->group(function() {
// Authentication routes
Route::get('login', '[email protected]')->name('login');
// ...
});
Kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\BeforeLanguage::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
。 (箱のうち、ウェブミドルウェアグループが自動的にルート/ RouteServiceProviderによってweb.phpファイルに適用されます。)
RouteServiceProvider.php
protected function mapWebRoutes()
{
$locale = Request::segment(1);
Route::prefix($locale)
->middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
}
おそらく、言語プレフィックスのないURLのルートはありません。 – tkausl
@tkausl迅速な対応に感謝します。あなたが正しい。私は言語の接頭辞なしのURLのためのルートを定義しませんでした。しかし、正しく理解すれば、すべてのリクエストを受け取り、欠落している場合には言語接頭辞を追加するBeforeLanguageミドルウェアが存在するため、定義する必要はありませんが、私の場合はミドルウェアが実行されません。 – Andreas
Laravelのドキュメントページによると、ミドルウェアグループのWebに割り当てられたミドルウェアは、デフォルトでweb.php内に定義された任意のルートに対して実行されます。これがあなたのジレンマです。 web.phpで現在のURLのルートが定義されていない限り、ミドルウェア(-group)は実行されません。 Laravelは最初にルートを見つける前にどのミドルウェアを実行するか分かりません。 – tkausl