【问题标题】:Symfony 2.8: how to localize URLs where the page name is in a variable?Symfony 2.8:如何本地化页面名称在变量中的 URL?
【发布时间】:2020-06-10 09:24:35
【问题描述】:

我正在维护一个在 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 模板中生成 URL:

<a href="/{{ app.request.locale }}/{{ 'static_page'|trans }}">

但是我需要几个不同的静态 HTML 模板,其中包含每个本地化页面的名称:

pagina_estatica.html.twig
static_page.html.twig

等等。我宁愿每个静态页面都有一个 HTML 模板,即使其中的内容是本地化的。

应用程序使用 JMSTranslationBundle 来翻译 Twig 模板中的字符串。我可以从控制器内部访问 JMS 翻译文件,以便从其翻译中获取规范的 $page 名称吗?有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: php symfony symfony-2.8


    【解决方案1】:

    有多种方法可以解决这个问题,但我认为最简单的解决方案是在控制器中实现某种映射。

    您可以轻松地将 switch case 导出到服务或静态方法中,以便在不同的地方使用它。

    在示例中,我引入了一个新变量$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');
        }
    

    【讨论】:

    • 感谢您的回答。但是,这几乎等同于在控制器中用 PHP 重新实现整个路由表(至少对于静态页面),不是吗?我希望有一个更简单的方法......
    • 嗯,在某个地方,您需要从页面到模板文件的映射。我的建议仅限于此。最好的方法是为每个路由实现一个方法,并利用 symfony 中的本地化路由功能,与 twig 中的路由生成相同......但这对你来说将是更多的工作。
    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多