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

Posted

技术标签:

【中文标题】Symfony2 路由:不允许的方法(允许:Method)【英文标题】: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

【问题讨论】:

【参考方案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

验证您的路线很有意义。

【讨论】:

以上是关于Symfony2 路由:不允许的方法(允许:Method)的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2:允许使用谷歌图表访问控制允许来源

symfony2 原则允许空值?

BlueImp 文件上传“错误:方法不允许” - Laravel 4 路由问题

在 Laravel 5.2 上路由文件路径时出现 405(不允许的方法)

Symfony2 - 将安全访问控制设置为只允许匿名身份验证

Laravel 5.4方法不允许补丁