【问题标题】:Symfony, fos_js_routing and problems with "_locale"Symfony、fos_js_routing 和“_locale”问题
【发布时间】:2014-09-15 06:59:47
【问题描述】:

这是我的 app/routing.yml

前端包:

resource: "@FrontendBundle/Resources/config/routing.yml"
prefix:   /{_locale}/
requirements:
    _locale: en|es

后端包:

resource: "@BackendBundle/Resources/config/routing.yml"
prefix:   /{_locale}/app
requirements:
    _locale: en|es

fos_js_routing: 资源:“@FOSJsRoutingBundle/Resources/config/routing/routing.xml”

这是我的 BackendBundle\Resources\Config\routing.yml

getModelsFromMake:

pattern:  /getModelsFromMake/{idMake}

defaults: { _controller: BackendBundle:Backend:getModelFromMake }
options:
    expose: true

我的问题是当我像这样进行 ajax 调用时:

$.ajax({ 类型:“POST”,

    url: Routing.generate('getModelsFromMake'),
    data: {
        idMake: $('#make').val(),
    },
    dataType: "json",
    success: function(data) { console.log("All OK"); },
    error: function()       { console.log("ERROR"); }
});

chrome 检查员告诉我:

Uncaught Error: The route "getModelsFromMake" requires the parameter "_locale".

有什么办法解决这个问题吗?

编辑 1:

在我的布局中我有这个:

<script type="text/javascript" src="{{ asset('bundles/fosjsrouting/js/router.js') }}"></script>
<script src="{{ path('fos_js_routing_js', {"callback": "fos.Router.setData"}) }}"></script>

编辑 2:

如果我运行命令“php app/console fos:js-routing:debug”,我会得到:

Name              Method Pattern
getModelsFromMake ANY    /{_locale}/app/getModelsFromMake

【问题讨论】:

  • 该代码是否包含在视图中?
  • 不,javascript 在另一个文件(Resources\backend.js)中,在我的布局中我导入了这样的文件:

标签: php symfony routing


【解决方案1】:

要将请求区域设置为您对 Routing.generate 的所有调用,您可以覆盖此方法并在每个调用中添加 {{app.request.locale}} 参数。以下脚本必须在 twig 模板中并在包含路由脚本之后执行。

<!-- Include JSRouting libs & exposed routes -->
<script src="{{ asset('bundles/fosjsrouting/js/router.js') }}"></script>
<script src="{{ path('fos_js_routing_js', {"callback": "fos.Router.setData"}) }}"></script>

<script>
    $(function () {
        // change name of initial method
        Routing.generateImpl = Routing.generate;
        // override generate fonction by adding a default _locale from request locale
        Routing.generate = function (url, params) {
            var paramsExt = {};
            if (params) {
                paramsExt = params;
            }
            if (!paramsExt._locale){
                paramsExt._locale = '{{ app.request.locale }}';
            }
            return Routing.generateImpl(url, paramsExt);
        }
    })
</script>

现在您可以透明地使用 Routing.generate,而无需担心 _locale 参数!

// in any JS file
var url = Routing.generate('mypath');
var url2 = Routing.generate('another path', {param: 1});

为了澄清代码,可以将之前的脚本隔离在一个 js 文件中。为此,必须按照@DonCallisto 的说明定义全局变量。

<!-- for exemple in the <head> of the page -->
<script>
    var REQUEST_LOCALE = '{{ app.request.locale }}';
</script>

所以在脚本中你可以使用 REQUEST_LOCALE

// this line
paramsExt._locale = '{{ app.request.locale }}';
// has to be replaced by
paramsExt._locale = REQUEST_LOCALE;

【讨论】:

  • 这是一个很好的解决方案。我希望它已经被纳入 FOSJsRoutingBundle。
【解决方案2】:

尝试在你的ajax之前插入这个sn-p代码

<script>
    var locale= {{ app.request.locale }} ;
</script>

并按如下方式修改您的脚本

$.ajax({ type: "POST",

    url: Routing.generate('getModelsFromMake', array('_locale' => locale)),
    data: {
        idMake: $('#make').val(),
    },
    dataType: "json",
    success: function(data) { console.log("All OK"); },
    error: function()       { console.log("ERROR"); }
});

【讨论】:

  • 嗨 DonCallisto,问题是当我的 js 文件与我的 twig 文件分开时,我无法访问 {{ app.request.locale }},但是可以,如果我将 'en' 或 'es' 与硬编码路线工作正常。
  • @RogerGuasch:您不必直接将代码的第一个 sn-p 添加到 js 中,只需将其放入 twig 中,然后再调用您的外部 js。你能试试吗?
  • 很遗憾 jsRouting 不像 twig 表达式 {{ path() }} 那样自动使用默认语言环境
猜你喜欢
  • 2016-02-06
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 2015-02-06
  • 2020-10-27
  • 2011-10-18
  • 2019-07-01
  • 1970-01-01
相关资源
最近更新 更多