【问题标题】: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
}

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

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

编辑路线错误:

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

删除路线错误:

没有找到“GET”的路线 /settings/2b2acd55-0dd6-11e5-8107-621ae3320fd4/defaults/delete/default”: 方法不允许(允许:DELETE)

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

感谢您的帮助,Anth

【问题讨论】:

    标签: php symfony symfony-routing


    【解决方案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
        

        验证您的路线很有意义。

        【讨论】:

          猜你喜欢
          • 2013-11-10
          • 1970-01-01
          • 1970-01-01
          • 2013-06-16
          • 1970-01-01
          • 2016-12-12
          • 2012-04-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多