2015-06-20 10 views
5

so in routing.yml habe ich die folgenden Routen festgelegt, um zu bearbeiten und bestimmte Einstellungen zu löschen:Symfony2 Routing: Methode nicht erlaubt (Allow: {Methode})

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] 

Und in meinem Controller habe ich die richtigen Aktionen definiert: 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 
} 

In der zweiten Aktion brauche ich nur die id und widgetType übergeben, damit ich den ausgewählten Datensatz abfragen und entfernen kann.

Wenn ich auf eine der beiden Routen erhalte ich die folgende:

Route bearbeiten Fehler:

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

Routenfehler Löschen:

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

Aber als ich entferne eins und lass das andere gut funktionieren. Ich nehme an, es ist die Pfaddefinitionen, die ähnlich sind? Ist es mir möglich, die gleichen Pfade zu behalten und diesen Fehler nicht zu bekommen? Was verstehe ich nicht?

Danke für Ihre Hilfe, Anth

Antwort

2

Sie erlauben nur POST, PUT und Methoden löschen, aber Sie werden diese Routen über GET-Methode zugreifen.

so Ihre Routen wie folgt definieren:

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 } 

Oder die DELETE verlassen, PUT und POST-Methoden in, wenn Sie wirklich diese Beschränkungen müssen und GET-Methode hinzufügen.

Wenn Sie mit Ihrem Browser auf eine URL zugreifen, senden Sie normalerweise eine Anfrage über die GET-Methode. Sie können mehr über diese lesen: Here And here

+0

Hey Jave, danke für die Antwort.Jetzt, da ich die Methoden entfernt habe, meldet sie beim Löschen einen Fehler in der 'editAction', warum wird diese Route auch aufgerufen? –

+0

@AnthBieb: Sie haben 'Methoden' entfernt, aber ich schlage vor, dass Sie es behalten; Das ist semantisch korrekt. Fehler ist nicht in Routen, sondern in URL-Anfrage (Sie müssen es mit DELETE, Put oder POST-Methode eingestellt setzen) – DonCallisto

+0

@AnthBieb, können Sie bitte den Fehler teilen? –

3

Sie haben Aktionen mit Crud generiert?

Ich habe eine Lösung für das Problem gefunden.

/** 
* 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')); 
} 

Der Kommentarcode stammt von crud, funktioniert nicht. Habe denselben Fehler (Keine Route gefunden für "GET ...) Ich versuche jetzt nicht, Symfony zu benutzen, um ein Formular zu löschen. Entferne nur Entity ist der richtige Weg für mich.

1

Statt dessen Ihrer Ansicht nach:

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

Verwendung eine Form:

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

gleiche gilt für Bearbeitungsformular