2015-06-20 191 views
5

所以在routing.yml中我为了编辑和删除特定的设置定义了以下路线:Symfony2的路由:不允许的方法(允许:(方法})

的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,以便查询和删除所选记录。

当我要不要去我得到以下的路线:

编辑路线错误:

No route found for "GET /settings/2b2acd55-0dd6-11e5-8107-621ae3320fd4/defaults/edit/default": Method Not Allowed (Allow: POST, PUT)

删除路由错误:

No route found for "GET /settings/2b2acd55-0dd6-11e5-8107-621ae3320fd4/defaults/delete/default": Method Not Allowed (Allow: DELETE)

但是,当我删除一个,并让其他工作正常。我假设它是相似的路径定义?我可以保持相同的路径而不会得到这个错误吗?我不了解什么?

感谢您的帮助,蒽

回答

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

+0

嘿JAVE,感谢您的回答。既然我已经删除了这些方法,那么在删除时,它会在'editAction'中报告一个错误,为什么该路由操作也会被调用? –

+0

@AnBieb:你删除了'methods'部分,但我建议你保留它;这在语义上是正确的。错误不在路由中,而是在url请求中(您需要使用DELETE,PUT或POST方法设置它) – DonCallisto

+0

@AnBieb,请分享该错误吗? –

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

取而代之的是在您的视图:

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

使用形式:

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

同为编辑表单