【问题标题】:PHP Silex routing localizationPHP Silex 路由本地化
【发布时间】:2014-10-31 10:58:31
【问题描述】:

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

理想情况下,我想创建一个与语言环境匹配的基本路由并以某种方式对其进行子类化,但我自己无法弄清楚如何以优雅的方式触发它。

【问题讨论】:

    标签: php routing locale silex


    【解决方案1】:

    我认为您可以使用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;
        }
    
    }
    

    【讨论】:

    • 是的!这样就可以了。谢谢!
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多