2015-08-23 23 views
8

Ho appena iniziato ad imparare Laravel 5 e sto provando a creare un sito Web multilingua e voglio utilizzare domini diversi per la lingua, quindi en.example.app punta alla versione inglese, es. .example.app in spagnolo e così via. Io uso i gruppi di percorsi e sotto c'è il mio codice.Laravel 5, instradamento del dominio secondario, con parametro opzionale

Route::group(['domain' => '{domain}.example.app'], function() { 
    Route::get('/', function() { 
     return view('index'); 
    }); 
    Route::get('test', function(){ 
     return view('index'); 
    }); 
}); 

Funziona bene per tutti i domini tranne example.app. Sfortunatamente i parametri opzionali {dominio?} Non funzionano per i sottodomini e non voglio duplicare percorsi come questo.

Route::get('/', function() { 
    return view('index'); 
}); 
Route::get('test', function(){ 
    return view('index'); 
}); 

Route::group(['domain' => '{domain}.example.app'], function() { 
    Route::get('/', function() { 
     return view('index'); 
    }); 
    Route::get('test', function(){ 
     return view('index'); 
    }); 
}); 

Qualcuno può consigliare come evitare questa duplicazione?

+0

se l'utente accede ad esempio.app quale lingua ottiene versione inglese o sito web personalizzato con display diverso –

risposta

2

Quello becuase il {domain}.example.app richiede un . prima example.app.

È possibile rimuovere il . e aggiungere contraint per domain parametro per poter avere atmost 1 .

Così il codice sarà simile a

Route::group(['domain' => '{domain}example.app'], function($group) { 
    Route::get('/', function ($domain) { 
     //code 
    }) ; 
    // more routes 

    foreach($group->getRoutes() as $route){ 
     $route->where('domain', '[a-z]+\.{0,1}'); 
    } 

}); 

P.S. : Non so se la mia espressione regolare è corretta o meno.

1

Le opzioni sono la duplicazione del percorso o un reindirizzamento del livello del server per le richieste HTTP senza un sottodominio.

L'opzione semplice è quella di inoltrare semplicemente example.app a www.example.app.

3

A MiddleWare mi ha aiutato.

Route::group(array('middleware' => 'resolve_domain'), function() { 
    Route::get('/', '[email protected]'); 
}); 

E in middleware -

public function handle($request, Closure $next) 
{ 
    $params = explode('.', $request->getHost()); 
    $sub_domains = config('admin_configs.editions'); // Predefined sub-domain 
    $edition = false; 
    if(!empty($params[0]) && in_array($params[0], $sub_domains, true)) { 
     $edition = $params[0]; 
    } 
    define('DOMAIN_EDITION', $edition); // Set constant to be used. 

    return $next($request); 
} 
2

Si potrebbe creare un file chiamato app-routes.php che contiene tutti i percorsi e poi nel tuo attuale routes.php file di

Route::group(['domain' => '{domain}.example.app'], function() { 
    include('app-routes.php'); 
}); 

Route::group(['domain' => 'example.app'], function() { 
    include('app-routes.php'); 
}); 
+0

Ottimo 1, ma l'hai provato? Come impostare il dominio su alcuni costanti? –

+0

Ho provato questo ma non ero in grado di collegare correttamente da example.app a sottodominio.esempio.app ... Qualche idea su questo? @ J-Davis. Ho provato questo {{URL :: route ('home', array ('sottodominio' => 'johndoe'))}}} – AceKYD

1
Route::group(['domain' => '{domain}.example.app'], function() { 

}); 

Route::group(['domain' => 'example.app'], function() { 

}); 

questo il modello è buono ma se tu w per utilizzare un linguaggio diverso aggiungi il file di localizzazione