2015-08-23 4 views
8

Ich habe gerade begonnen Laravel 5 zu lernen und versuchen, mehrsprachige Website zu erstellen und verschiedene Domänen für die Sprache verwenden möchten, so en.example.app verweist auf englische Version, es .example.app auf Spanisch und so weiter. Ich verwende Routengruppen und unten ist mein Code.Laravel 5, Sub-Domain-Routing, mit optionalem Parameter

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

Es funktioniert für alle Domänen außer example.app. Leider funktionieren die optionalen Parameter {domain?} Nicht für Subdomains, und ich möchte solche Routen nicht duplizieren.

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'); 
    }); 
}); 

Kann jemand bitte beraten, wie man diese Verdoppelung vermeidet?

+0

wenn Benutzer auf example.app zugreift welche Sprache er bekommt Englische Version oder eigene Webseite mit anderer Anzeige –

Antwort

2

Das ist becuase der {domain}.example.app ein . erfordern vor example.app.

können Sie die . entfernen und contraint für domain Parameter hinzufügen, für sie atmost 1 .

So ist der Code zu haben, wird wie folgt aussehen

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. : Ich weiß nicht, ob meine Regex korrekt ist oder nicht.

1

Ihre Optionen sind entweder die Routenduplizierung oder eine Umleitung auf Serverebene für HTTP-Anfragen ohne Subdomain.

Die einfache Option besteht darin, example.app einfach an www.example.app weiterzuleiten.

3

Ein MiddleWare hat mir geholfen.

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

Und 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

Sie könnten eine Datei app-routes.php Namen erstellen, die Ihre Routen aller enthält und dann in Ihrer aktuellen routes.php Datei

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

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

Great 1, aber hast du es ausprobiert? Wie setze ich die Domain auf eine Konstante? –

+0

Ich habe es ausprobiert, aber ich konnte nicht richtig von example.app auf subdomain.example.app verlinken ... Irgendwelche Gedanken dazu? @ j-Davis. Ich habe es versucht {{URL :: route ('home', array ('subdomain' => 'johndoe'))}} – AceKYD

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

}); 

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

}); 

dieses Muster ist gut, aber wenn Sie w ant um verschiedene Sprachen zu benutzen Lokalisierungsdatei hinzufügen