2017-10-28 4 views
0

Ich versuche, eine Website mit mehreren Sprachen (mit Laravel 5.5) zu erstellen. Deshalb folge ich dem Tutorial https://mydnic.be/post/how-to-build-an-efficient-and-seo-friendly-multilingual-architecture-for-your-laravel-application, aber irgendwie habe ich Probleme mit der Sprache Middleware-Teil:Web-Middleware wird nicht ausgeführt (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); 
    } 
} 

Es funktioniert, wenn ich eine URL mit der Kennung für die Sprache zu öffnen, e. G. http://ps.dev/de/app/login, aber ich bekomme "Sorry, die gesuchte Seite konnte nicht gefunden werden." Wenn ich versuche, die Seite ohne die Sprachkennung in der URI zu öffnen, e. G. http://ps.dev/app/login.

Aber hier würde ich erwarten, dass die Middleware das Sprachsegment zum URI hinzufügt. Irgendeine Idee was könnte schief gehen?

Unten möchte ich einige zusätzliche Informationen bereitstellen.

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', 
    ], 
]; 

Nach der Laravel Dokumentationsseite der an die Middleware-Gruppe Web zugewiesen Middle für jede Strecke innerhalb web.php definiert standardmäßig ausgeführt werden sollen . (Out of the box, ist die Web-Middleware-Gruppe auf Ihre Routen/web.php Datei vom RouteServiceProvider automatisch übernommen.)

RouteServiceProvider.php

protected function mapWebRoutes() 
{ 

    $locale = Request::segment(1); 

    Route::prefix($locale) 
     ->middleware('web') 
     ->namespace($this->namespace) 
     ->group(base_path('routes/web.php')); 

} 
+0

Sie haben wahrscheinlich keine Route für URLs ohne das Sprachenpräfix. – tkausl

+0

@tkausl Danke für die schnelle Antwort. Du hast recht. Ich habe keine Route für URLs ohne Sprachpräfix definiert. Aber wenn ich es richtig verstehe, muss ich keins definieren, da es die BeforeLanguage Middleware gibt, die jede Anfrage übernehmen und das Sprachpräfix hinzufügen sollte, falls es fehlt, aber irgendwie wird die Middleware in meinem Fall nicht ausgeführt. – Andreas

+0

Sie haben es selbst erwähnt: "Laut der Laravel-Dokumentationsseite werden die Middlewares, die dem Middlewaregruppen-Web zugewiesen sind, standardmäßig für jede in der web.php definierte Route ausgeführt", das ist Ihr Dilemma. Solange in der web.php keine Route für die aktuelle URL definiert ist, wird die Middleware (-group) nicht ausgeführt. Laravel weiß nicht, welche Mittel zu laufen, bevor es zuerst eine Route findet. – tkausl

Antwort

3

Ich glaube, Sie einen harten Weg gewählt hatte, etwas wie "erfinde das Rad neu!" ;)

Obwohl es Ihre Entscheidung und respektvoll ist, als Vorschlag versuchen this schönes Paket für die Lokalisierung in Laravel: D

+0

Eigentlich dachte ich, ich mache es einfach und folge einfach einem Schritt-für-Schritt-Tutorial, aber wie sich herausstellte, ist es nicht so einfach (zumindest in meiner Implementierung). Sowieso. Danke für den Tipp. – Andreas

+0

Okey. Mit diesem Paket habe ich es in wenigen Minuten fertiggestellt. Vielen Dank! – Andreas

+0

@Andreas Gern geschehen :) – YaserKH

0

Der Grund, warum es sendet an die 404 ist, dass die URL nicht existiert. In Ihrer Routendatei haben Sie keine Pfade für die Sprache erstellt. Also letztendlich, wenn Ihre Middleware arbeitet, wird es auf den nicht vorhandene Route Pfad senden, die 404. seiner

eine Kennung für die Sprache hinzufügen: -

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

überprüfen Sie Routen durch die folgenden Handwerker Befehl in cmd

php artisan route:list 
+0

Danke für den Vorschlag, aber es funktioniert immer noch nicht. Schließlich habe ich beschlossen, es mit mcamara zu realisieren. – Andreas