начиная с 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');
В идеале я хотел бы создать базовый маршрут, который бы соответствовал локали и каким-то образом подклассировать его, но сам не мог понять, как это элегантно запустить.
Я думаю, что вы можете делегировать локальное обнаружение с 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;
}
}
Других решений пока нет …