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

时间:2015-06-20 17:26:57

标签: php symfony symfony-routing

所以在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
}

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

当我去任何一条路线时,我得到以下内容:

编辑路线错误:

  

找不到" GET的路线   /设置/ 2b2acd55-0dd6-11e5-8107-621ae3320fd4 /默认/编辑/默认&#34 ;:   方法不允许(允许:POST,PUT)

删除路线错误:

  

找不到" GET的路线   /设置/ 2b2acd55-0dd6-11e5-8107-621ae3320fd4 /默认/删除/默认&#34 ;:   方法不允许(允许:删除)

但是,当我删除一个并离开另一个他们工作正常。我假设它的路径定义相似吗?我可以保持相同的路径而不会出现此错误吗?我不理解的是什么?

感谢您的帮助,Anth

4 个答案:

答案 0 :(得分:3)

您是否使用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试图使用表格删除。只删除实体对我来说是正确的方法。

答案 1 :(得分:2)

您只允许使用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 }

或者保留DELETE,PUT和POST方法,如果你真的需要这些限制并添加GET方法。

当您使用浏览器访问URL时,通常是通过GET方法发送您的请求。您可以阅读更多相关信息: Here And here

答案 2 :(得分:2)

而不是在您的视图中:

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

使用表格:

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

编辑表格相同

答案 3 :(得分:0)

对于遇到此问题但其他答案未解决的其他任何人,请检查您是否不小心将另一个方法命名为同一事物。如果发生这种情况,其中之一将被忽略。

对此进行检查的一种方法是

php bin/console debug:router

验证路线很有意义。