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

Php Symfony2路由:不允许方法(允许:{Method}),php,symfony,symfony-routing,Php,Symfony,Symfony Routing,因此,在routing.yml中,我定义了以下路由,以便编辑和删除特定设置: 路由。yml: settings.editDefaults: path: settings/{id}/defaults/edit/{widgetType} defaults: { _controller: AppBundle:Settings:editDefaults } methods: [POST, PUT] settings.deleteDefaults: path

因此,在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]
/**
 * 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
}
在我的控制器中,我定义了正确的操作: SettingController.php:

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]
/**
 * 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
,这样我就可以查询并删除所选记录

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

编辑路由错误:

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]
/**
 * 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
}
找不到“获取”的路由 /设置/2b2acd55-0dd6-11e5-8107-621ae3320fd4/默认值/编辑/默认值”: 不允许使用方法(允许:POST、PUT)

删除路由错误:

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]
/**
 * 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
}
找不到“获取”的路由 /设置/2b2acd55-0dd6-11e5-8107-621ae3320fd4/默认值/删除/默认值”: 方法不允许(允许:删除)

但是当我去掉一个,留下另一个时,它们工作得很好。我假设路径定义是相似的?我是否可以保持相同的路径而不出现此错误?我不明白什么


感谢您的帮助,您只允许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方法发送请求。您可以阅读更多关于这些的信息:
您是否使用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) }}
{{form\u start(delete\u form)}
删除
{{form_end(delete_form)}

编辑表单相同

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

检查这是否正常的一种方法是

php bin/console debug:router

验证您的路由是有意义的。

嘿,JaVe,谢谢你的回答。现在我已经删除了这些方法,在删除时,它会在
editAction
中报告一个错误,为什么该路由操作也被称为?@AnthBieb:你删除了
方法
部分,但我建议你保留它;这在语义上是正确的。错误不存在t在路由中,但在url请求中(您需要使用DELETE、PUT或POST方法设置调用它)