我正在管理一个用Symfony 2.8开发的项目。在这个项目中,除了业务逻辑部分,有几个静态页面,原来的开发者通过在控制器中创建一个方法来处理它们。
/**
* @Route("/{page}/", name="pagina")
*/
public function pagesAction(Request $request, $page)
{
if (!$this->get('templating')->exists('default/'. $page . '.html.twig')) {
throw new NotFoundHttpException();
}
return $this->render('default/' . $page . '.html.twig');
}
然后在控制器中添加这个 routing.yml
:
pages:
path: /{page}/
defaults: { _controller: AppBundle:Default:pages }
现在我需要对这些静态页面的URL进行本地化,我想知道如何做到这一点。我可以手工生成HTML模板中的URLs。
<a href="/{{ app.request.locale }}/{{ 'static_page'|trans }}">
但是我需要有几个不同的静态HTML模板 用每个本地化页面的名字。
pagina_estatica.html.twig
static_page.html.twig
等等 我宁愿每个静态页面都有一个HTML模板,即使其中的内容是本地化的。
该应用程序使用JMSTranslationBundle来翻译Twig模板中的字符串。我是否可以从控制器内部访问JMS翻译文件,以获得规范的 $page
名称与其译名?有什么其他方法可以解决这个问题吗?
有多种方法可以解决这个问题,但我认为最简单的解决方案是在控制器中实现某种映射。
你可以很容易地将开关案例导出为服务或静态方法,以便在不同的地方使用它。
在这个例子中,我引入了一个新的变量 $templateFile
以使其更加清晰。
/**
* @Route("/{page}/", name="pagina")
*/
public function pagesAction(Request $request, $page)
{
// translated page name to template mapping
switch($page){
case 'pagina_estatica':
$templateFile = 'static_page';
break;
default:
$templateFile = $page;
}
if (!$this->get('templating')->exists('default/'. $templateFile . '.html.twig')){
throw new NotFoundHttpException();
}
return $this->render('default/' . $templateFile . '.html.twig');
}