Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF2][Symfony2][Symfony]Obsłużenie wyjątku przy wstawianiu rekordu z kluczem unique
Forum PHP.pl > Forum > PHP > Frameworki
amii
Mam tabelę z kluczem unique. Teraz kiedy z poziomu formularza próbuje dodać rekord, który już jest w bazie dostaje brzydką stronę 500 Internal server error a chciałbym to jakoś obsłużyć.

Wydawało mi się, że takie coś powinno przechwycić ten wyjątek ale nie działa, testowo sprawdzałem to umieszczając die z komunikatem:
  1. try {
  2. $em->persist($klasaAdresowa);
  3. die('ehh'); //umiesicilem testowo tu sie wyswietla
  4. $em->flush();
  5. die('ehh'); //umiesicilem testowo tu sie NIE wyswietla
  6. }
  7. catch (Exception $e) {
  8. die('ehh'); //umiesicilem testowo tu sie NIE wyswietla
  9. // jaka wiadomosc
  10. $this->get('session')->getFlashBag()->add(
  11. 'error',
  12. 'Wystąpił błąd rekord nie został zapisany!'
  13. );
  14. }
ziolo
Walidujesz formularz ?

Dodaj do encji constraint:

http://symfony.com/doc/current/reference/c...iqueEntity.html
amii
Do przechwycenia wyjątku potrzeba było dać catch (\Exception $e) powstał jednak inny problem. Nie mogę przekazać informacji poprzez flashBag mój kod wygląda tak:

  1. if ($form->isValid()) {
  2. // perform some action, such as saving the task to the database
  3. $klasaAdresowa = $form->getData();
  4.  
  5. try {
  6. $em->persist($klasaAdresowa);
  7. $em->flush();
  8. }
  9. catch (\Exception $e) {
  10. // jaka wiadomosc
  11. $this->get('session')->getFlashBag()->add(
  12. 'error',
  13. 'Wystąpił błąd rekord nie został zapisany!'
  14. );
  15.  
  16. // jaka ikona do wiadomosci
  17. $this->get('session')->getFlashBag()->add(
  18. 'error',
  19. 'error'
  20. );
  21. return $this->forward('MyBundleCMSBundle:KlasyAdresowe:index');
  22. }
  23.  
  24. // jaka wiadomosc
  25. $this->get('session')->getFlashBag()->add(
  26. 'notice',
  27. 'Dane klasy adresowej zostały poprawnie zapisane!'
  28. );
  29.  
  30. // jaka ikona do wiadomosci
  31. $this->get('session')->getFlashBag()->add(
  32. 'info',
  33. 'info'
  34. );
  35.  
  36. return $this->redirect($this->generateUrl('my_bundle_klasyadresowe_index'));
  37. }



Kod bazowego szablonu widoku, gdzie wyświetlają się komunikaty zwrotne:
  1. {% block flash %}
  2. <div id="flash-messanger" class="{% for classMessage in app.session.flashbag.get('info') %}{{classMessage}}{% endfor %}">
  3. {% for flashMessage in app.session.flashbag.get('notice') %}
  4. {{ flashMessage }}
  5. {% endfor %}
  6. </div>
  7. {% endblock %}


Przypuszczalnie to kwestia dwóch przekierowań i w efekcie zresetowania flashBag jakie następują po przechwyceniu wyjątku, pytanie jak to obejść ? Zamiast forward próbowałem też redirect
skowron-line
A gdzie tu masz 2 przekierowania questionmark.gif
amii
Z przekierowaniami jest jednak ok bo zasugerowałem się konsolą. Tam były wysyłane 2 requesty jeden to było wykonanie samej akcji z formularza a drugi redirect z kodu powyżej więc ok.
Tylko czemu jeśli ustawiam wiadomości flash już po tym pierwszym request nie jest on widoczny ?

EDIT: już nieważne, problem rozwiązany
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.