2014-10-31 136 views
4

以Silex開頭。PHP Silex路由本地化

說我想要一個本地化的網站,所有路由都開始/{_locale}和不喜歡重複自己爲:

$app->match('/{_locale}/foo', function() use ($app) { 
return $app['twig']->render('foo.twig'); 
}) 
->assert('_locale', implode('|', $app['languages.available'])) 
->value('_locale', $app['locale.default']) 
->bind('foo'); 

$app->match('/{_locale}/bar', function() use ($app) { 
    return $app['twig']->render('bar.twig'); 
    }) 
    ->assert('_locale', implode('|', $app['languages.available'])) 
    ->value('_locale', $app['locale.default']) 
    ->bind('bar'); 

理想情況下,我想創建一個基本路線,將與區域匹配並以某種方式進行子類化,但無法自己弄清楚如何以優雅的方式觸發它。

回答

5

我想你可以委託當地的檢測與mount功能:

你安裝你想要支持的每個地方的路線,但他們重定向到同一個控制器:

$app->mount('/en/', new MyControllerProvider('en')); 
    $app->mount('/fr/', new MyControllerProvider('fr')); 
    $app->mount('/de/', new MyControllerProvider('de')); 

而且現在的本地可以是你的控制器的一個屬性:

class MyControllerProvider implements ControllerProviderInterface { 

    private $_locale; 

    public function __construct($_locale) { 
     $this->_locale = $_locale; 
    } 

    public function connect(Application $app) { 
     $controler = $app['controllers_factory']; 


     $controler->match('/foo', function() use ($app) { 
          return $app['twig']->render('foo.twig'); 
         }) 
       ->bind('foo'); 

     $controler->match('/bar', function() use ($app) { 
          return $app['twig']->render('bar.twig'); 
         }) 
       ->bind('bar'); 

     return $controler; 
    } 

} 
+0

是的!那會的。謝謝 ! – MJ1 2014-11-03 13:40:51