使用 Twig 和 Symfony2 在 javascript 中生成路由

Posted

技术标签:

【中文标题】使用 Twig 和 Symfony2 在 javascript 中生成路由【英文标题】:Generating routes in javascript with Twig and Symfony2 【发布时间】:2011-11-29 10:04:07 【问题描述】:

很奇怪的问题,很抱歉问,我对 Symfony/Twig 很陌生。我的路线需要一个强制性的region_id 参数:

ajax_provinces_by_region:
  pattern: /ajax/region/region_id/provinces
  defaults: _controller: SWAItaliaInCifreBundle:Ajax:provincesByRegion 
  requirements: region_in: \d+

问题是:如何根据javascript中的select元素生成这条路线(代码如下)?

问题是:我不能使用 Symfony 的 pathurl 助手,因为它们需要指定 region_id 参数 (this.value) 我无法访问,因为它是一个 javascript 变量(并且 Twig 是在服务器端编译的)。

$(document).ready(function() 
    $('select#regions').change(function()

        // Make an ajax call to get all region provinces
        $.ajax(
            url: // Generate the route using Twig helper
        );

    );
);

【问题讨论】:

如果你不喜欢使用 bundle 可以使用这个技巧:***.com/a/16584335/4008043 【参考方案1】:

您可以使用FOSJsRoutingBundle。

【讨论】:

Routing.generate('route_name')【参考方案2】:
url:  " path('SampleBundle_route','parameter':controller_value) "

其中SampleBundle_route 是在 routing.yml 或注释中定义的有效路径。

为了测试,在树枝模板中写下这个:

<script>
    var url= " path('SampleBundle_route') ";
    alert(url);
</script>

【讨论】:

【参考方案3】:

我知道这是一个老问题,但以防万一你不想安装像 FOSJsRoutingBundle 这样的包,这里有一个小技巧:

var url = ' path("yourroute", 'region_id': 'region_id') '; 
url = url.replace("region_id", this.value);

'region_id' 只是用作占位符,然后你在 JS 中用你的实际变量 this.value 替换它

【讨论】:

这是一个很好的变体,但 FOSJsRoutingBundle 是最好的解决方案。 这会将 url 中的 '&' 字符转义为 & 这是行不通的,因为我的 js 文件在资产文件夹中,它是 src 文件夹的兄弟.. 我认为这是最好的解决方案,并且我已经成功使用了一段时间。如果您有路由要求和多个值,则失败的地方。例如,我有一个包含两个变量的路由,并且两个变量都必须是数字("\d+"),因此对于临时值,我将一个简单的整数添加到每个变量中,然后替换。最终引起我注意的是,真实项目的 id 在第二个 url.replace 上被替换,导致生成无效路径。【参考方案4】:
 * @Route("/id/edit", name="event_edit", options="expose"=true)

【讨论】:

【参考方案5】:

您可以在 html 中使用 data 属性:

<select id="regions">
    % for region in regions %
        <option data-path=" path('ajax_provinces_by_region', 'region_id': region.id) ">...</option>
    % endfor %
</select>

然后在你的javascript中:

$('select#regions').on('change', function() 

    let path = $(this).find(':selected').data('path')

    $.ajax(
        'url': path
    )
)

【讨论】:

以上是关于使用 Twig 和 Symfony2 在 javascript 中生成路由的主要内容,如果未能解决你的问题,请参考以下文章

使用 Assetic / Twig / Symfony2,我可以定义前端库吗?

在带有 Symfony2 的 Twig 中使用 % stylesheets % 标签时通过 Twig 运行 CSS 文件

在 Twig 模板中使用 Symfony2 控制器返回

Symfony2 在 Twig 中获取用户角色

尝试在我的项目中实现没有 Symfony2 的 Twig 和 Assetic

在 Symfony2 中使用 Twig 作为 JavaScript 的资产过滤器