2016-01-18 27 views
5

Sto cercando un modo per rendere tutte le route app con più impostazioni internazionali senza utilizzare i gruppi di route. Questo perché utilizzo un pacchetto di estensioni esterne, il che significa che i percorsi sono registrati in molti posti.Laravel 5.0. * Middleware per rimuovere il prefisso locale dall'URL prima che i percorsi vengano elaborati

In sostanza voglio avere/foo/bar oltre a/en/foo/bar,/de/foor/bar,/es/foo/bar ecc. Tutti da riconoscere ed elaborare tramite/foot/bar route

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

Pertanto, quanto sopra potrebbe darmi "en result" o "de result" o "es result".

Ho già il middleware che imposta le impostazioni internazionali in base al segmento del percorso. Ho provato il seguente senza fortuna.

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

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

} 

return $next($request); 

Speriamo che questo sia possibile o che ci sia un altro modo per raggiungerlo.

EDIT ------

Sulla base di un commento qui sotto ho inciso rapidamente aggiungendo il seguente codice in pubblico/index.php. Speriamo che questo possa dare un'idea migliore di ciò che sto cercando di ottenere modificando l'oggetto richiesta.

$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

Non riuscivo a trovare nulla per facilitare fare ciò che state cercando. Forse mi è sfuggito qualcosa, ma ho guardato attraverso la classe di richiesta sia di laravel che di symfonys. Purtroppo non ho trovato nulla di valore. Detto questo, puoi intercettare la richiesta nell'indice.file php nella cartella pubblica e quindi impostare '$ _SERVER [" REQUEST_URI "]' prima di creare l'oggetto richiesta e funzionerà. –

+0

Ho provato rapidamente qualcosa all'interno del file index.php, il che significa che posso modificare la variabile del server prima che arrivi a Laravel. Comunque penso che abbia bisogno di qualcosa di meglio, visto che uso le configurazioni per locales ecc. – Ben

+0

Sto affrontando lo stesso problema e non riesco neanche a farlo funzionare. Sembra che l'oggetto 'Request' sia immutabile. Ho impostato anche un rapido hack in index.php, ma uso anche l'URI per locales etc, quindi continuo a fare ricerche. – Pbal

risposta

1

È possibile raggiungerlo facilmente collegandosi all'app un po 'prima. Crea un ServiceProvider e crea un metodo register e inserisci la tua logica.

<?php namespace App\Providers; 

use Illuminate\Support\ServiceProviders; 
use Illuminate\Support\Facades\Request; 

class LocaleServiceProvider extends ServiceProvider { 

    // Fires during the registration of this ServiceProvider :) 
    public function register(Request $request) { 

     // Altar the Request object here 
     // ... 
     // ... 

    } 
} 
+0

Questo non ha funzionato. Ho ricevuto un errore a causa del seguente errore LocaleServiceProvider :: register (Illuminate \ Http \ Richiesta $ richiesta) deve essere compatibile con Illuminate \ Support \ ServiceProvider :: register() Ho usato il contructor per passare in un'app istanza e utilizzata $ app-> richiesta. Tuttavia, non riesco ancora a farlo cambiare davvero. Il percorso è ancora gestito allo stesso modo – Ben

+0

Ho apportato una modifica alla domanda/ai dettagli precedenti sopra se questo aiuta – Ben

2

Ecco il codice corretto per modificare l'URL prima che vengano chiamati i percorsi.

<?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/"); 
    } 
} 

notare, andare a prendere il percorso dall'istanza richiesta senza duplicarlo primo testamento per qualche motivo causare il REQUEST_URI di non essere modificabile. Presumo da qualche parte nel codebase laravel sta inizializzando la richiesta quando chiamate il metodo path().

+0

C'è un modo per farlo in Lumen? –

0

nessuno di questi ha funzionato per me con 5.5. L'approccio è buono, ma per me l'argomento della richiesta non è stato iniettato nel metodo register, allo stesso modo instance() non è un metodo statico e non dovrebbe essere chiamato come tale.

Tuttavia, utilizzando il contenitore di servizi di acquisire un'istanza Request ha permesso di cambiare la richiesta di percorso prima di essere analizzato all'interno delle ServiceProviders register metodo:

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

Spero che questo aiuta qualcuno!

Acclamazioni

Edit: La risposta di Pastore è tecnicamente più corretto, come egli usa la facciata al posto della classe effettiva. Tuttavia, l'iniezione di entrambi non funziona su register ma è possibile utilizzare alternativamente:

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