Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony2][SF2][SF]Obsługa wyjątku przy usuwaniu rekordu z bazy
Forum PHP.pl > Forum > PHP > Frameworki
amii
W ajaxie obsługuje usuwanie rekordów z bazy i w przypadku błędu (np. usuwania rekordu z powiązanym kluczem obcym) mam zwróconą stronę z błędem 500 (widzę to z poziomu konsoli).
To co chcę osiągnąć to:
- przechwycenie tego wyjątku
- zwrócenie zamiast strony błędu, odpowiedzi w formacie json

W kontrolerze mam tak ale cały czas zwraca stronę z błędem 500
  1. public function usunKlientaAction()
  2. {
  3. $em = $this->getDoctrine()->getManager();
  4. $response = new JsonResponse();
  5. $request = $this->container->get('request');
  6. $klient_id = $request->request->get('klient');
  7.  
  8. $repository = $this->getDoctrine()->getRepository('MojeBundleCMSBundle:Klienci');
  9. $ka = $repository->find($klient_id);
  10.  
  11. try {
  12. $em->remove($ka);
  13. $em->flush();
  14. }
  15. catch (Exception $e) {
  16. $response->setData(array('class' => 'error', 'message' => 'Wystapił błąd podczas usuwania rekordu!'));
  17. return $response;
  18. }
  19.  
  20. $response->setData(array('class' => 'notice', 'message' => 'Rekord został poprawnie usuniety!'));
  21. return $response;
  22. }
Damonsson
A co Ty chcesz przechwytywać? Skoro masz zawsze 500, to ślesz request pod zły adres, a nie masz żadnego błędu w zapytaniu, bo nawet tam nie dochodzisz. Więc po prostu to popraw.
amii
Mam błąd np. kiedy usuwam rekord z kluczem obcym. I wtedy pluje coś w stylu: 'cascading remove : integrity constraint violation 1451' chodzi mi o to żeby użytkownik dostał info jako json a nie żeby ajax zwracał error 500
Damonsson
No to pokaż tego AJAXa którego wysyłasz.
ohm
To może lepiej sprawdzić dlaczego wywala 500? A nie próbować go catchować. Relacje masz dobrze "połapane"?
No i czy musisz rekord fizycznie usuwać? Czy nie wygodniej dać mu jakiś status i ustawiać np na deleted.
amii
AJAX w php wywoływany z poziomu JS to jest właśnie ten fragment co zamieściłem czyli metoda usunKlientaAction()

Jeśli zaś chodzi o JS, to po prostu odwołanie się do tej metody
[JAVASCRIPT] pobierz, plaintext
  1. $( document ).ready(function() {
  2. (function( $ ) {
  3. $('.remove').click(function() {
  4. if (confirm('Czy na pewno chcesz usunąć tego klienta ?')) {
  5. $.ajax({
  6. url : '{{path("ajax_update_klienciusun")}}',
  7. type: 'POST',
  8. data : {
  9. 'klient' : $(this).attr('data-attr')
  10. },
  11. cache : false,
  12. success : function(data) {
  13. $("#flash-messanger").addClass(data.class).html(data.message);
  14. $("#flash-messanger").fadeIn(800);
  15. setTimeout(function() {
  16. $("#flash-messanger").fadeOut('fast');
  17. window.location.reload(true);
  18. }, 5000); // <-- hide after 5000 milliseconds
  19. }
  20. });
  21. }
  22. });
  23. }(jQuery));
  24. });
[JAVASCRIPT] pobierz, plaintext
Damonsson
[JAVASCRIPT] pobierz, plaintext
  1. $( document ).ready(function() {
  2. (function( $ ) {
  3. $('.remove').click(function() {
  4. if (confirm('Czy na pewno chcesz usunąć tego klienta ?')) {
  5. $.ajax({
  6. url : '{{path("ajax_update_klienciusun")}}',
  7. type: 'POST',
  8. data : {
  9. 'klient' : $(this).attr('data-attr')
  10. },
  11. cache : false,
  12. success : function(data) {
  13. $("#flash-messanger").addClass(data.class).html(data.message);
  14. $("#flash-messanger").fadeIn(800);
  15. setTimeout(function() {
  16. $("#flash-messanger").fadeOut('fast');
  17. window.location.reload(true);
  18. }, 5000); // <-- hide after 5000 milliseconds
  19. },
  20. statusCode: {
  21. 500: function() {
  22. alert("500");
  23. }
  24. }
  25. });
  26. }
  27. });
  28. }(jQuery));
  29. });
[JAVASCRIPT] pobierz, plaintext


Wyłapało? Oprócz Success też masz możliwość dodania error jeszcze
Crozin
@Damonsson: 500 Internal Server Error oznacza błąd w skrypcie (nieprzechwycony wyjątek w tym przypadku). Chyba pomyliłeś z 404 Not Found.
@amii: Popraw aplikację, bo zakładasz, że jej działanie oparte jest na błędzie. W zależności od tego co dokładnie potrzebujesz:
1. Albo sprawdź czy dany obiekt w ogóle da się usunąć w danym momencie i na podstawie tego zdecyduj czy w ogóle pokazać linka do usunięcia czy nie. Oczywiście w samej akcji usuwającej również powinieneś mieć tego typu zabezpieczenie.
2. Albo popraw swój kod tak, by w ogóle działał, tj. przed usunięciem danego klienta usuń wszystkie dane które mają z nim relację. Tutaj @ohm również dobrze zauważył, że podobnie jak w większości przypadków tak i tutaj dużo lepiej jest oznaczyć dane jako usunięte - usuwanie danych jest niebezpieczne.

PS. Obiekt Requesta powinieneś przekazać jako argument akcji; nie masz żadnego zabezpieczenia przed CSRF, a co za tym idzie Twój kod jest mało bezpieczny.
Damonsson
Dobrze prawisz, myślałem o 500, a napisałem o 404 facepalmxd.gif
amii
Crozin - poprawiłem ten błąd z usuwaniem i kluczami obcymi poprzez nadanie nullable=true, onDelete="SET NULL" dla tabeli z kluczami obcymi.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.