你好,这是什么? 它是关于使用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 »
如果你想看到完整的堆栈跟踪告诉我。 我正在寻找你的答案!
答案 0 :(得分:2)
您不能以这种方式将查询字符串添加到路径定义中。 Query strings不作为路由参数处理。请查看Generating URLs with Query Strings的the 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请执行以下操作,
设置您的路线
show_by_id: pattern:/ search / {id} 默认值:{_ control:WeatherBundle:Search}
如果您正在使用twig,则需要按如下方式设置表单操作:
action =“{{path('show_by_id',{'id':id})}}”
您将在搜索控制器的索引操作中收到此ID,如下所示:
public function indexAction(Request $ request,$ id){ //做的工作 }
这可能会解决您的问题..