2014-10-31 101 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