Symfony2 路由:不允许的方法(允许:Method)
Posted
技术标签:
【中文标题】Symfony2 路由:不允许的方法(允许:Method)【英文标题】:Symfony2 Routing: Method Not Allowed (Allow: Method)Symfony2 路由:不允许的方法(允许:Method) 【发布时间】:2015-09-06 13:06:57 【问题描述】:所以在 routing.yml 中我定义了以下路由以编辑和删除特定设置:
routing.yml:
settings.editDefaults:
path: settings/id/defaults/edit/widgetType
defaults: _controller: AppBundle:Settings:editDefaults
methods: [POST, PUT]
settings.deleteDefaults:
path: settings/id/defaults/delete/widgetType
defaults: _controller: AppBundle:Settings:deleteDefaults
methods: [DELETE]
在我的控制器中,我定义了正确的操作: SettingController.php:
/**
* edit the default settings of a hotel/widget
*/
public function editDefaultsAction(Request $request)
//Edit logic
/**
* delete a default setting of a hotel/widget
*/
public function deleteDefaultsAction($hotelId, $widgetType)
//Delete logic
在第二个操作中,我只需要传递id
和widgetType
,这样我就可以查询并删除选定的记录。
当我去任何一条路线时,我都会得到以下信息:
编辑路线错误:
没有找到“GET”的路线 /settings/2b2acd55-0dd6-11e5-8107-621ae3320fd4/defaults/edit/default”: 方法不允许(允许:POST、PUT)
删除路线错误:
没有找到“GET”的路线 /settings/2b2acd55-0dd6-11e5-8107-621ae3320fd4/defaults/delete/default”: 方法不允许(允许:DELETE)
但是当我删除一个并留下另一个时,它们工作正常。我假设它的路径定义是相似的?我是否可以保持相同的路径而不出现此错误?我不明白什么?
感谢您的帮助,Anth
【问题讨论】:
【参考方案1】:您只允许使用 POST、PUT 和 DELETE 方法,但您正在通过 GET 方法访问这些路由。
所以像这样定义你的路线:
settings.editDefaults:
path: settings/id/defaults/edit/widgetType
defaults: _controller: AppBundle:Settings:editDefaults
settings.deleteDefaults:
path: settings/id/defaults/delete/widgetType
defaults: _controller: AppBundle:Settings:deleteDefaults
如果您确实需要这些限制并添加 GET 方法,也可以保留 DELETE、PUT 和 POST 方法。
当您使用浏览器访问 URL 时,通常是通过 GET 方法发送请求。您可以阅读更多关于这些的信息: Here And here
【讨论】:
嗨,JaVe,感谢您的回答。既然我已经删除了方法,那么在删除时,它会在editAction
中报告错误,为什么还要调用该路由操作?
@AnthBieb:你删除了methods
部分,但我建议你保留它;这在语义上是正确的。错误不在路由中,而是在 url 请求中(您需要设置 DELETE、PUT 或 POST 方法来调用它)【参考方案2】:
您是否使用 CRUD 生成操作?
我找到了解决这个问题的方法。
/**
* Deletes a Preisliste entity.
*
*/
public function deleteAction(Request $request, $id)
/*$form = $this->createDeleteForm($id);
$form->handleRequest($request);
if ($form->isValid())
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('MandantBundle:Preisliste')->find($id);
if (!$entity)
throw $this->createNotFoundException('Unable to find Preisliste entity.');
$em->remove($entity);
$em->flush();
return $this->redirect($this->generateUrl('preisliste'));*/
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('MandantBundle:Preisliste')->find($id);
if (!$entity)
throw $this->createNotFoundException('Unable to find Preisliste entity.');
$em->remove($entity);
$em->flush();
return $this->redirect($this->generateUrl('preisliste'));
注释代码来自 CRUD 并且不起作用。我得到同样的错误(没有为“GET ...找到路由”)我不知道为什么 Symfony 会尝试使用表单来删除。只删除实体对我来说是正确的方法。
【讨论】:
【参考方案3】:在你看来,而不是这个:
<a href=" path('settings_delete', 'id': settings.id ) ">
Delete
</a>
使用表格:
form_start(delete_form)
<button type="submit">Delete</button>
form_end(delete_form)
编辑表单也是如此
【讨论】:
【参考方案4】:对于遇到其他答案未解决的问题的其他人,请检查您是否不小心将另一个方法命名为相同的东西。如果发生这种情况,其中之一将被忽略。
进行健全性检查的一种方法是这样做
php bin/console debug:router
验证您的路线很有意义。
【讨论】:
以上是关于Symfony2 路由:不允许的方法(允许:Method)的主要内容,如果未能解决你的问题,请参考以下文章
BlueImp 文件上传“错误:方法不允许” - Laravel 4 路由问题
在 Laravel 5.2 上路由文件路径时出现 405(不允许的方法)