Symfony2路由:不允许方法(允许:{方法})


Symfony2 Routing: Method Not Allowed (Allow: {Method})

所以在routing.yml中,我定义了以下路线,以便编辑和删除特定设置:

路由。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
}

在第二个操作中,我只需要传递idwidgetType,就可以查询和删除所选记录。

当我走其中一条路线时,我会得到以下信息:

编辑路线错误:

未找到"GET"的路由/设置/2b2cd55-0dd6-11e5-8107-621ae3320fd4/defaults/edit/default":不允许的方法(允许:POST、PUT)

删除路由错误:

未找到"GET"的路由/设置/2b2cd55-0dd6-11e5-8107-621ae3320fd4/defaults/delete/default":不允许的方法(允许:DELETE)

但当我去掉一个,留下另一个时,它们会很好地工作。我想是路径定义相似吗?我有可能保持相同的路径而不出现这个错误吗?我有什么不明白的?

感谢您的帮助,Anth

您是否使用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为什么试图使用表单删除。只有删除实体对我来说是正确的方式。

在您的视图中不是这样:

<a href="{{ path('settings_delete', { 'id': settings.id }) }}">
    Delete
</a>

使用一种形式:

{{ form_start(delete_form) }}
    <button type="submit">Delete</button>
{{ form_end(delete_form) }}

与编辑表单相同

您只允许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方法发送请求。您可以阅读更多关于这些的信息:在这里此处

如果其他人遇到其他答案无法解决的问题,请检查您是否意外地将另一个方法命名为相同的方法。如果发生这种情况,其中一个将被忽略。

健全性检查的一种方法是进行

php bin/console debug:router

验证你的路线是有意义的。