2015-06-20 114 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) }} 

同爲編輯表單