8

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

在第二个动作中,我只需要idandwidgetType传递,这样我就可以查询和删除选定的记录。

当我去任何一条路线时,我都会得到以下信息:

编辑路线错误:

找不到“GET /settings/2b2acd55-0dd6-11e5-8107-621ae3320fd4/defaults/edit/default”的路由:不允许方法(允许:POST、PUT)

删除路线错误:

未找到“GET /settings/2b2acd55-0dd6-11e5-8107-621ae3320fd4/defaults/delete/default”的路由:不允许方法(允许:删除)

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

谢谢你的帮助,安思

4

4 回答 4

4

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

于 2015-12-17T10:26:19.417 回答
3

而不是在您看来:

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

使用表格:

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

编辑表单相同

于 2017-06-10T16:16:04.230 回答
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 方法发送请求。你可以阅读更多关于这些: 这里 和这里

于 2015-06-20T18:06:50.470 回答
1

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

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

php bin/console debug:router

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

于 2020-11-06T02:45:12.077 回答