2017-10-28 15 views
0

複数言語の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')); 

} 
+0

おそらく、言語プレフィックスのないURLのルートはありません。 – tkausl

+0

@tkausl迅速な対応に感謝します。あなたが正しい。私は言語の接頭辞なしのURLのためのルートを定義しませんでした。しかし、正しく理解すれば、すべてのリクエストを受け取り、欠落している場合には言語接頭辞を追加するBeforeLanguageミドルウェアが存在するため、定義する必要はありませんが、私の場合はミドルウェアが実行されません。 – Andreas

+0

Laravelのドキュメントページによると、ミドルウェアグループのWebに割り当てられたミドルウェアは、デフォルトでweb.php内に定義された任意のルートに対して実行されます。これがあなたのジレンマです。 web.phpで現在のURLのルートが定義されていない限り、ミドルウェア(-group)は実行されません。 Laravelは最初にルートを見つける前にどのミドルウェアを実行するか分かりません。 – tkausl

答えて

3

私はあなたがハードな方法を選択したと思います「ホイールを再現する」のようなもの;)

を提案はLaravelにローカライズのためthis素敵なパッケージを試してみてそれは、あなたの決定と敬意ですが:D

+0

実際、私はそれを簡単な方法で行い、ステップバイステップのチュートリアルに従っていると思っていましたが、それは単純ではありませんでした(少なくとも私の実装では)。とにかく。ヒントをありがとう。 – Andreas

+0

Okey。最後に、このパッケージを使用して数分以内に作業を進めました。ありがとう! – Andreas

+0

@アンドレアスあなたは大歓迎です:) – YaserKH

0

は、それが404に送信している理由は、URLが存在しないということです。ルートファイルでは、言語のパスを作成していません。

Route::get('{lang}/login', '[email protected]')->name('login'); 

はあなたに以下の職人によって路線を確認 - :あなたの ミドルウェアが動作するのであれば、最終的に、それは404

言語の識別子を追加します非既存のルートパスに送信されますcmdのコマンド

php artisan route:list 
+0

提案していただきありがとうございますが、それでも動作しません。最後に、私はmcamaraでそれを実現することに決めました。 – Andreas

関連する問題