2016-01-18 3 views
5

Ich bin auf der Suche nach einer Möglichkeit, alle App Routen haben mehrere Locales ohne Verwendung von Routengruppen. Dies liegt daran, dass ich ein externes Erweiterungspaket verwende, was bedeutet, dass Routen an vielen Orten registriert sind.Laravel 5.0. * Middleware zum Entfernen Präfix Locale von der URL vor der Verarbeitung von Routen

Im Wesentlichen möchte ich/foo/bar sowie/en/foo/bar,/de/foor/bar,/es/foo/bar usw. alle von der/foot/bar-Route erkannt und verarbeitet werden

Route::get('foo/bar', function() { 
    return App::getLocale() . ' result'; 
}); 

Also das oben würde mir 'en result' oder 'de result' oder 'es result' geben.

Ich habe bereits Middleware, die das Gebietsschema basierend auf dem Pfadsegment setzt. Ich habe folgendes ohne Glück versucht.

... 
    $newPath = str_replace($locale,'',$request->path()); 

    $request->server->set('REQUEST_URI',$new_path); 

} 

return $next($request); 

Hoffentlich ist dies möglich, oder es gibt eine andere Möglichkeit, es zu erreichen.

EDIT ------

auf einen Kommentar Basierend unten ich es schnell indem Sie den folgenden Code in public/index.php gehackt. Hoffentlich wird dies eine bessere Vorstellung davon geben, was ich zu erreichen versuche, indem ich das Anfrageobjekt bearbeite.

$application_url_segments = explode('/', trim($_SERVER["REQUEST_URI"], '/')); 

$application_locale = $application_url_segments[0]; 

$application_locales = ['en' => 'English', 'de' => 'German']; 

if (array_key_exists($application_locale, $application_locales)) { 

    $_SERVER["REQUEST_URI"] = str_replace('/' . $application_locale,'',$_SERVER["REQUEST_URI"]); 

} 
+0

Ich konnte persönlich nichts finden, um Easilly tun, was Sie wollen. Ich habe vielleicht etwas verpasst, aber ich habe beide Laravel- und Symfonys Request-Klassen durchgesehen. Leider habe ich nichts Wertvolles gefunden. Davon abgesehen können Sie die Anfrage im Index abfangen.PHP-Datei im Öffentlichen Ordner und setzen Sie dann $ _SERVER ["REQUEST_URI"] ', bevor es das Anfrageobjekt erstellt und es funktioniert. –

+0

Ich habe schnell etwas in der Datei index.php versucht, was bedeutet, dass ich die Servervariable bearbeiten kann, bevor sie Laravel erreicht. Ich denke jedoch, dass ich etwas besseres brauche, da ich Configs für Locales etc. verwende. – Ben

+0

Ich stehe vor dem gleichen Problem und ich kann es auch nicht funktionieren. Es scheint, dass das Request-Objekt unveränderlich ist. Ich habe auch einen schnellen Hack in index.php gesetzt, aber ich benutze auch den URI für Locales usw., also recherchiere ich noch. – Pbal

Antwort

1

Sie können dies leicht erreichen, indem Sie etwas früher in die App einhaken. Erstellen Sie einen ServiceProvider und erstellen Sie eine register Methode und legen Sie Ihre Logik dort hinein.

+0

Das hat nicht funktioniert. Ich habe einen Fehler wegen des folgenden Fehlers LocaleServiceProvider :: registrieren (Illuminate \ Http \ Request $ Anfrage) muss kompatibel sein mit Illuminate \ Support \ ServiceProvider :: register() Ich habe den Konstruktor verwendet, um in einer App übergeben Instanz und verwendet $ app-> Anfrage. Allerdings - ich bin immer noch nicht in der Lage, etwas zu ändern. Die Route wird immer noch gleich gehandhabt – Ben

+0

Ich habe eine Bearbeitung der ursprünglichen Frage/Detail oben gemacht, wenn das hilft – Ben

2

Hier ist der richtige Code, um die URL zu bearbeiten, bevor die Routen aufgerufen werden.

<?php namespace App\Providers; 
use Illuminate\Foundation\Application; 
use Illuminate\Support\ServiceProvider; 
use Illuminate\Support\Facades\Request; 

class LanguageServiceProvider extends ServiceProvider { 
    public function register() { 
     Request::instance()->server->set('REQUEST_URI',"/uri/"); 
    } 
} 

zu beachten, den Weg von der Anforderungsinstanz zu holen, ohne es zuerst Willen aus irgendeinem Grunde führt die REQUEST_URI zu Duplizieren nicht bearbeitet zu sein. Ich nehme an, irgendwo in der Codebasis laravel initialisiert die Anfrage, wenn Sie die Methode path() aufrufen.

+0

Gibt es eine Möglichkeit, dies in Lumen zu tun? –

0

nichts davon funktionierte tatsächlich für mich mit 5.5. Der Ansatz ist gut, aber für mich wurde das Request-Argument nicht in die register Methode injiziert, ebenso ist instance() keine statische Methode und sollte nicht als solche aufgerufen werden.

jedoch mit dem Service-Container eine Instanz von Request machte es möglich, erwerben die Anfrage-Pfad zu ändern, bevor es in den ServiceProviders register Methode analysiert wird:

public function register() 
{ 
    $this->app->make('Illuminate\Http\Request')->instance()->server->set('REQUEST_URI',"/what/ever/"); 
} 

Ich hoffe, das jemand hilft!

Prost

edit: Antwort des Pastors ist technisch korrekt, als er die Fassade anstelle der tatsächlichen Klasse verwendet. Die Injektion funktioniert jedoch weder auf register noch können Sie alternativ verwenden:

use \Illuminate\Support\Facades\Request 
//... 
public function register() 
{ 
    Request::instance()->server->set('REQUEST_URI',"/what/ever/"); 
} 
Verwandte Themen