php - with - symfony create controller



Symfony2 Controller wird keine Ausnahme abfangen (2)

Dies ist der Routen-Handler für meine Löschaktion. Es funktioniert gut, solange der Gegenstand keine Assoziationen hat.

public function projectDeleteAction()
{
    try {
        $request = $this->get('request');
        $my_id = $request->query->get('id');

        $em = $this->get('doctrine.orm.entity_manager');

        $item = $em->find('MyBundle:Main', $my_id);

        $em->remove($item);
        $em->flush();

        $info = $item->getName();
        $result = 0;
    }
    catch (Exception $e) {
        $info = toString($e);
        $result = -1;
    }

    return $this->render('MyBundle:Main:response.xml.twig',
            array('info' => $info, 'result' => $result ));
}

Ich habe bereits den Fehler gelöst, zu versuchen, ein Element mit Assoziationen zu löschen, aber durch diesen Prozess warf "flush" PDOException. Ich versuchte es auf verschiedene Arten, aber es scheint in Symfony2 eingefangen zu werden und antwortet dann mit einem HTTP 500-Fehler. Gibt es eine Möglichkeit, dass ich Symfony2 nicht fangen kann, damit ich damit umgehen kann? Dies ist eine XML-Antwort mit AJAX und daher würde ich lieber einen Fehlercode wie oben beschrieben senden.


Es ist besser, die Ausnahme zu fangen, die Sie wirklich fangen wollen. In diesem Beispiel ist dies wahrscheinlich Doctrine / DBAL / DBALException und / oder Doctrine / DBA / DBAException.

So

catch (Doctrine\DBAL\DBALException $e) {
  $result = -1;
};

Ich würde empfehlen, etwas zu tun wie:

    } catch (\Exception $e) {
        switch (get_class($e)) {
            case 'Doctrine\DBAL\DBALException':
                echo "DBAL Exception<br />";
                break;
            case 'Doctrine\DBA\DBAException':
                echo "DBA Exception<br />";
                break;
            default:
                throw $e;
                break;
        }
    }

Dies fängt tatsächlich die DB-Ausnahmen ab, und wenn aus irgendeinem Grund eine andere Ausnahme auftritt, wird dies erneut in Symfony2 zurückgeworfen.


Ich musste folgendes tun, was einigen Benutzern helfen könnte;

try{
    $this->doctrine->em->persist($user);
    $this->doctrine->em->flush();
}catch(Exception $e){
    if($e->getPrevious()->getCode() == 23505){
        //handle duplicate error, 23505 is for postgres, 23000 is mysql unique constraint.    
    }
}