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

В идеале я хотел бы создать базовый маршрут, который бы соответствовал локали и каким-то образом подклассировать его, но сам не мог понять, как это элегантно запустить.

4

Решение

Я думаю, что вы можете делегировать локальное обнаружение с 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;
}

}
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]