2016-08-19 1 views
0

J'utilise Silex 2 et je voudrais rediriger vers la page d'accueil avec les paramètres régionaux par défaut si une URL est chargée en utilisant un environnement local non valide.Silex rediriger la modification des paramètres régionaux

// homepage/root 
    $this->get('{_locale}/', function (Request $request) use ($app) { 
     return $app['twig']->render('index/index.html.twig', array()); 
    })->bind('homepage'); 

Avant middleware:

// i18n Control 
    $locale = $request->getLocale(); 
    $allowLocale = ['en','es','de']; 
    if (!in_array($locale, $allowLocale)) { 
     $request->setLocale('en'); 
     $response = new \Symfony\Component\HttpFoundation\RedirectResponse($app['url_generator']->generate('homepage'), 301); 
     $response->prepare($request); 
     return $response->send(); 
    } 

Mais ce code produit une boucle infinie.

Je veux:

Si l'utilisateur d'ajouter cette URL:/es/foo alors tout est ok.

Si l'utilisateur insère cette URL:/fr/foo, il doit alors être redirigé vers/fr.

Merci.

Répondre

0

Vous pouvez faire la même chose, mais facilement car vous pouvez transmettre le paramètre URL au service url_generator. Aussi pour rendre votre application plus souple et moins sujette aux erreurs, vous devez embarace le conteneur pour les configurations globales (pour allowedLocales et DefaultLanguage):

// somewhere in your configuration 
$app['defaultLanguage'] = 'en'; 
$app['allowedLocales'] = ['en','es','de'] 

// Then in your controller 
$locale = $request->getLocale(); 
if (!in_array($locale, $app['allowLocales'])) { 

    $request->setLocale($app['defaultLanguage']); 
    $app['translator']->setLocale($app['defaultLanguage']); 

    return $app->redirect(
     $app['url_generator']->generate('homepage', ["locale" => $app['defaultLanguage']]), 
     301 
    ); 
} 
0

J'ai trouvé cette solution:

$locale = $request->getLocale(); 
    $allowLocale = ['en','es','de']; 
    if (!in_array($locale, $allowLocale)) { 
     $defaultLanguage = 'en'; 
     $targetUrl = $app['url_generator']->generate('homepage'); 

     $request->setLocale($defaultLanguage); 
     $app['translator']->setLocale($defaultLanguage); 

     $targetUrl = str_replace("/$locale/", "/$defaultLanguage/", $targetUrl); 

     return $app->redirect($targetUrl, 301); 
    } 

Mais je voudrais mettre en œuvre une autre solution plus élégante.

Que pensez-vous les gars?

+0

Vous pouvez le faire facilement, vérifier ma réponse ci-dessous ... – mTorres

+0

Merci pour votre contribution, cela m'a été utile. – cybtow