FOSJSRoutingBundle:“路由 xxx 不存在”

Posted

技术标签:

【中文标题】FOSJSRoutingBundle:“路由 xxx 不存在”【英文标题】:FOSJSRoutingBundle : "Route xxx does not exist" 【发布时间】:2013-04-08 11:53:18 【问题描述】:

我在使用 FOSJSRoutingBundle 时遇到了一个非常奇怪的问题:

首先,这是我的配置:我正在使用 Symfony 2.0.23 和 JQuery,在带有 WAMP(Apache 2.4.2 和 php 5.4.3)的 Windows 7 64 位上工作。 我已经完成了 FOSJSRoutingBundle 的 github 上的所有设置,并公开了我的路线(我可以通过谷歌搜索找到的几乎所有相关问题(在 FOSJSRoutingBundle 的 github、here 和不同的论坛上)都是因为人们没有公开他们的路线,但我试过了php app/console fos:js-routing:debug 并且我确实看到了我的路由)。 js添加到布局中(布局代码在最后)。

试图在js中为路由生成url,一开始我想生成两个不同的路由,但为了测试我创建了下面的js代码:

    //Code inside this function is working
    $("select").change(function () 
      param=this.options[this.selectedIndex].value;
      test1=Routing.generate('myBundle_step3',  myParam: param );
      alert(test1);
      window.location=Routing.generate('myBundle_step2');
    );
    //Code inside this one is also working
    $('input[type="checkbox"]').change(function() 
      test=Routing.generate('myBundle_step2');
    ).change();
    //This is not working
    test=Routing.generate('myBundle_step2');
    alert(test);

使用此代码,我收到 javascript 错误“路径 myBundle_step2 不存在”。虽然第一部分仍然有效(警报给了我创建的链接并且重定向顺利)。 如果我删除第二个函数,我不会再收到 Javascript 错误。

如果在第二个函数中我将 step2 替换为 step3,则错误变为“路由 myBundle_step3 不存在”。 我试图清除缓存并再次运行 php app/console asset:install --symlink,但没有结果。

这里是控制器对应的代码(实际代码有点长,我觉得不相关,如果你这么认为,我可以随便写:

    namespace my\Bundle\Controller;
    class IndividuController extends Controller
    
      public function step2Action() 
        Some code
      
      public function step3Action($myParam) 
        Some code
      
    

相对于 bundle 的 routing.yml 配置文件:

    myBundle_step2:
      pattern: /step/2
      defaults: _controller: myBundle:Individu:step2
      options:
        expose: true
    myBundle_step3:
      pattern: /step/3/myParam
      defaults: _controller: myBundle:Individu:step3
      options:
        expose: true

app/config/routing.yml 文件:

    fos_js_routing:
      resource: "@FOSJsRoutingBundle/Resources/config/routing/routing.xml"

    myBundle:
      resource: "@myBundle/Resources/config/routing.yml"
      prefix:   /

布局的相关信息:

     <!-- jQuery via Google + local fallback, see h5bp.com -->
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js">    </script>
        <script>window.jQuery || document.write('<script src="js/jquery-1.7.1.min.js"><\/script>')</script>
           % javascripts 'bootstrap/js/bootstrap.js'
                        'bundles/fosjsrouting/js/router.js'
                        'bundles/crrisuaps/js/suaps.js' %
               <script type="text/javascript" src=" asset_url "></script>
           % endjavascripts %
        <script src=" path('fos_js_routing_js', "callback": "fos.Router.setData") "></script>
       </body>
    </html>

php 应用程序/控制台路由器的结果:调试(我只留下了相关信息 + 我留下了未定义的变量通知以防万一,这是我添加这个库后收到的通知,但该库仍然有效,我不认为问题可能来自这里:

C:\wamp\www\suapsRepo\suaps>php 应用程序/控制台路由器:调试

注意:未定义变量:C:\wamp\www\suapsRepo\suaps\vendor\html2 中的 kPathUrl pdf_class\tcpdfConfig.php 在第 80 行

调用堆栈: 0.0070 231536 1. main() C:\wamp\www\suapsRepo\suaps\app\console:0 0.0209 685656 2.require_once('C:\wamp\www\suapsRepo\suaps\app\bootstr ap.php.cache') C:\wamp\www\suapsRepo\suaps\app\console:10 0.0212 701752 3.require_once('C:\wamp\www\suapsRepo\suaps\app\autoloa d.php') C:\wamp\www\suapsRepo\suaps\app\bootstrap.php.cache:3 0.1335 2998152 4.require_once('C:\wamp\www\suapsRepo\suaps\vendor\html 2pdf\html2pdf.class.php') C:\wamp\www\suapsRepo\suaps\app\autoload.php:51 0.1379 3361792 5.require_once('C:\wamp\www\suapsRepo\suaps\vendor\html 2pdf_class\myPdf.class.php') C:\wamp\www\suapsRepo\suaps\vendor\html2pdf\html2p df.class.php:19 0.1385 3393792 6.require_once('C:\wamp\www\suapsRepo\suaps\vendor\html 2pdf_class\tcpdfConfig.php') C:\wamp\www\suapsRepo\suaps\vendor\html2pdf_class \myPdf.class.php:12

[router] 当前路由

    Name                                            Method Pattern
    _assetic_55f0319                                ANY    /css/55f0319.css
    _assetic_55f0319_0                              ANY    /css/55f0319_bootstrap_1.
    css
    _assetic_55f0319_1                              ANY    /css/55f0319_bootstrap-re
    sponsive_2.css
    _assetic_55f0319_2                              ANY    /css/55f0319_style_3.css
    _assetic_3608a04                                ANY    /js/3608a04.js
    _assetic_3608a04_0                              ANY    /js/3608a04_bootstrap_1.j
    s
    _assetic_3608a04_1                              ANY    /js/3608a04_router_2.js
    _assetic_3608a04_2                              ANY    /js/3608a04_suaps_3.js

    fos_js_routing_js                               ANY    /js/routing._format
    myBundle_homepage                        ANY    /

    myBundle_inscription_etape1              ANY    /inscription/etape/1
    myBundle_inscription_etape2              ANY    /inscription/etape/2
    myBundle_inscription_etape3              ANY    /inscription/etape/3/dis
    ciplineSelection

php app/console fos:js-routing:debug 的结果(我删除了 PHP 通知,但它发生在我发出的每个命令上):

    C:\wamp\www\suapsRepo\suaps>php app/console fos:js-routing:debug
    [router] Current routes
    Name                               Method Pattern
    crrisuapsBundle_inscription_etape2 ANY    /inscription/etape/2
    crrisuapsBundle_inscription_etape3 ANY    /inscription/etape/3/disciplineSelect
    ion

编辑:另外,不知道它是否相关,但是当我尝试 'php app/console fos:js-routing:debug myBundle_step2' 我得到以下 php 错误:

[错误异常] 警告:缺少 Symfony\Bundle\FrameworkBundle\Command\RouterDebugCommand:outputRoute() 的参数 3,在第 62 行的 C:\symfonyDirectory\vendor\bundles\FOS\JsRoutingBundle\Command\RouterDebugExposedCommand.php 中调用并在 C:\serverDirectory 中定义\vendor\symfony\src\Symfony\Bundle\FrameworkBundle\Command\RouterDebugCommand.php 第 98 行

【问题讨论】:

你能用你的路由的注解/xml配置向我们展示你的这两个动作的控制器吗? 我编辑并添加了所有的 routing.yml + 控制器代码。 你的布局中添加js了吗?见here 是的,js 已添加到布局中,抱歉我忘了在主题正文中提及它。我编辑。 在routing.yml中“myBundle_step3”的参数是aParam,但是在js中是myParam。打错字了? 【参考方案1】:

我遇到了同样的问题,问题出在我的配置文件中。尝试检查:

# app/config/config.yml
fos_js_routing:
    routes_to_expose: [ myBundle_step2, myBundle_step3, ... ]

【讨论】:

【参考方案2】:

我也有这个问题。在路由配置上设置options.expose 参数为我解决了这个问题。

routing.yml

cart_edit:
    pattern:  /Cart/edit
    defaults:  _controller: CartCartBundle:Default:cart_edit 
    options:
        expose: true

my.js

var url = Routing.generate('cart_edit');
$.post(url, function(data) 
      //do somthing
);

根据需要进行更改。希望这能解决您的问题。

【讨论】:

为我工作,这应该被接受。它是在 jsRouting 文档中编写的,但对于像我这样急躁的开发人员来说不够突出。 无法检查它,因为我不再拥有该项目(以前的公司),但鉴于投票率很高,我想该解决方案的工作如此被接受。 谢谢,为我工作。 我快疯了!太感谢了!!文档在这方面真的很差......事实上,有一些令人困惑的事情(比如导入和东西......我猜那是针对 NodeJs 的,对吧?)。【参考方案3】:

为了完整性:也可以使用注释 (options="expose"=true),如 documentation 中所述:

// src/AppBundle/Controller/DefaultController.php

/**
 * @Route("/foo/id/bar", options="expose"=true, name="my_route_to_expose")
 */
public function indexAction($foo) 
    // ...

这也适用于控制器级别的路由集(来自我的一个控制器的示例):

/**
 * Channel controller.
 *
 * @Route("account/account/todos", options="expose"=true)
 * @ParamConverter("account", class="AppBundle:Account", options=
 *     "repository_method" = "findOneById",
 *     "mapping": "account": "id",
 *     "map_method_signature" = true
 * )
 */
class TodoListController extends Controller

【讨论】:

谢谢。我非常渴望尝试,以至于我没有阅读您的答案...本可以节省几分钟:) options="expose"=true,注释成功了!

以上是关于FOSJSRoutingBundle:“路由 xxx 不存在”的主要内容,如果未能解决你的问题,请参考以下文章