In Symfony 2, welches ist der beste Weg, um einen Link zum Löschen eines Datensatzes zu erstellen?
Ich kann eine Route zu /entity/delete
definieren, die nur eine DELETE
-Methode akzeptiert, aber ich weiß nicht, wie man einen DELETE
-Link aus einer Vorlage erstellt. Dasselbe gilt für das Erstellen von PUT
-Links.
Also, was machst du? Akzeptieren Sie GET
petition, um einen Datensatz zu löschen? Gibt es eine Möglichkeit, einen DELETE
-Link zu erstellen?
Anker können nur GET-Anforderungen auslösen. Und da GET-Anforderungen zwischengespeichert werden können und in einigen zukünftigen Versionen (wenn Sie ernsthaftes Caching implementieren) den App-Code möglicherweise überhaupt nicht erreichen, ist es eine schlechte Übung, GET zu verwenden, um Änderungen an dem Zustand Ihrer App vorzunehmen. Hier ist, was ich in meinen Projekten mache. Mit diesen beiden können Sie in Ihren Vorlagen Folgendes tun:
%Vor% Angenommen, Ihr Entity-Löschpfad lautet: /my_entity
, Methoden: [DELETE]
Prinzip ist wirklich einfach. delete_link
Erweiterungsmethode erstellt data-attribute
auf dem Anker, so dass der kompilierte Anker wie folgt aussehen wird:
Wenn jemand dann auf diesen Link klickt, fängt javascript diesen Klick ein, erstellt ein Formular und löst eine DELETE-Anfrage mit der ID aus, die in data-delete-link
attribut bereitgestellt wird.
Hier ist, was es möglich macht, eine LinkHelper
Twig-Erweiterung:
Und ich habe ein JavaScript in meiner Basisvorlage:
%Vor% Dies funktioniert nur für Entitäten mit dem Primärschlüssel id
. Sie können dies jedoch ganz einfach an Ihre Anforderungen anpassen und Composite-Primärschlüssel usw. unterstützen.
Symfony2 _method
Funktionsbeschreibung finden Sie in So definieren Sie Routen Anforderungen Unten ist die Lösung, die ich verwende.
Link
%Vor%Erneutes Formatieren des obigen Links nach copy-paste
Attach onClick-Ereignis-Listener:
JS
%Vor%Controller
%Vor%Hinweis
@CsrfProtector
ist meine benutzerdefinierte Annotation, mit der das in der Anforderung übergebene CSRF-Token überprüft wird, bevor die Controller-Methode ausgeführt wird.
Diese Lösungen funktionieren nicht ohne aktiviertem JavaScript. Wenn Sie nur einen "Delete Button" in Ihrem Edit-Formular benötigen, wäre es auch möglich einen zweiten Submit mit Delete Name zu erstellen und in der updateAction Ihres Controllers auf deleteAction umzuleiten, wenn der "delete-submit" Button angeklickt wurde.
Basierend auf dem Rat von Bernhard Zürn , sehen Sie, wie man den Link ohne Javascript löscht :
1) Fügen Sie in Ihrem Formular-Generator eine zweite Schaltfläche zum Senden hinzu.
%Vor%2) Zeigen Sie in Ihrer Zweigvorlage die Löschschaltfläche wo immer Sie möchten. In diesem Beispiel verwende ich das gleiche Formular zum Hinzufügen und Bearbeiten eines Benutzers. Also habe ich den Code in eine 'if' Bedingung gesetzt, um die Editieraktion zu erkennen.
%Vor% 3) Verwenden Sie in Ihrem Controller die Methode isClicked()
der Schaltfläche zum Abfragen, wenn auf die Schaltfläche "Löschen" geklickt wurde:
Um weitere Fortschritte zu erzielen, können Sie vor dem Ausführen der Routenaktion die Bestätigungsnachricht Are you sure you want to delete this user ?
in JavaScript hinzufügen.