PHP Silex路由本地化

MJ1*_*MJ1 4 php routing locale silex

从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');
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*ste 6

我想你可以用mount函数委托本地检测:

您为要支持的每个本地安装路由,但它们重定向到同一个控制器:

    $app->mount('/en/', new MyControllerProvider('en'));
    $app->mount('/fr/', new MyControllerProvider('fr'));
    $app->mount('/de/', new MyControllerProvider('de'));
Run Code Online (Sandbox Code Playgroud)

现在本地可以是您的控制器的属性:

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

}
Run Code Online (Sandbox Code Playgroud)