为什么我得到“找不到......的路线”

时间:2013-11-19 10:01:39

标签: php symfony routing routes

你好,这是什么? 它是关于使用symfony2设置路由以及它为什么生成“找不到...的路由”

显然它看起来像这样:

app\config\routing.yml
user:
    resource: "@UserBundle/Resources/config/routing.yml"
    prefix:   /user/

weather:
    resource: "@WeatherBundle/Resources/config/routing.yml"
    prefix:   /

在我看来,这一切都是正确的。我们将讨论@WeatherBundle 那么我的捆绑包的表现如何呢? 这是:

.../WeatherBundle/Resources/config/routing.yml
home:
    path:  /
    defaults: { _controller: WeatherBundle:Default:index }
    methods:  [GET]

show_by_id:
    path:  /search?{type}={query}
    defaults: { _controller: WeatherBundle:Search:id }
    requirements:
        type:  id|city

show_forecast:
    path:  /forecast?id={query}&{type}={value}
    defaults: { _controller: WeatherBundle:Forecast:forecast, type: hours, value: 6 }
    requirements:
        type:  days|hours
        value: \d+
    methods:  [GET]

这是正确的吗?我看不出任何错误,或者可能是因为我还不知道有关symfony2中路由的信息? 现在问题: 当我输入地址时:http://localhost/app_dev.php/search?id=6295630 我们可以看到路径为:/search?{type}={query}其中{type}=id {query}=6295630所以最终形式如下:/search?id=6295630 我很确定它应该可行,但它不起作用。它叫:

No route found for "GET /search"
404 Not Found - NotFoundHttpException
1 linked Exception: ResourceNotFoundException »

如果你想看到完整的堆栈跟踪告诉我。 我正在寻找你的答案!

2 个答案:

答案 0 :(得分:2)

您不能以这种方式将查询字符串添加到路径定义中。 Query strings不作为路由参数处理。请查看Generating URLs with Query Stringsthe documentation部分。

然后你应该替换,

show_by_id:
    path:  /search?{type}={query}
    defaults: { _controller: WeatherBundle:Search:id }
    requirements:
        type:  id|city

通过

show_by_id:
    path:  /search/{type}/{query}
    defaults: { _controller: WeatherBundle:Search:id }
    requirements:
        type:  id|city

并在控制器中获取您的路线参数值,如here所述。

代码重构,

  • 名为id的动作并不意味着很多> WeatherBundle:Search:id

更新,

要按/search?id=6295630替换/search/[id|city]/{id},您必须

1 - 将您的路径更改为:/search/{type}/{id}
 2 - 将您的show_by_id路线要求更改为:

  requirements:
    type:  id|city

3 - 将您的操作签名更改为,

  public function idAction($type, $id)

,我认为将查询字符串用于此特定用例并不是一个好主意。 但是当你问一个使用查询字符串的例子时,这里有一个(取自文档):

假设您的路线具有以下路径/blog/{page}。然后,调用/blog/2?category=Symfony会在您的路线中附加category参数(作为查询字符串)。

然后,您可以通过调用$request->query->get('category');(其中$request表示当前处理的请求)来控制您的控制器中的此参数。

答案 1 :(得分:1)

Vardius请执行以下操作,

  1. 设置您的路线

    show_by_id:     pattern:/ search / {id}     默认值:{_ control:WeatherBundle:Search}

  2. 如果您正在使用twig,则需要按如下方式设置表单操作:

    action =“{{path('show_by_id',{'id':id})}}”

  3. 您将在搜索控制器的索引操作中收到此ID,如下所示:

    public function indexAction(Request $ request,$ id){ //做的工作 }

  4. 这可能会解决您的问题..