2010-12-20 7 views
1

Vielleicht war ich gerade völlig unwissend für die Lösung meines Problems und, verdammt, vielleicht ist es eingebaut ... Ich habe es einfach nicht geschafft, eine solche Lösung zu finden. Ich habe die letzten zwei Wochen passiv geschaut und den letzten Tag aktiv.Wie behandelt man Fremdschlüssel-Constraints innerhalb einer Symfony-Anwendung?

Wie kann ich anmutig eine Fremdschlüsseleinschränkung in symfony behandeln?

Ich habe erwogen, die Ausnahme (Doctrine_Connection_Exception) und unter der Annahme war es eine Fremdschlüssel-Einschränkung, dann Weiterleiten des Benutzers an ein Fehlermodul mit einer Aktion für Fremdschlüssel Einschränkungen. Allerdings ist die Code-Redundanz grauenhaft und selbst wenn ich es in meine Basis-Action-Klasse lege, würde es sehr hässlich werden, wenn ich einen try-catch-Block um jeden Aufruf der Datenbank setzen müsste. Ganz zu schweigen von, die Annahme, dass die Ausnahme für eine Fremdschlüsseleinschränkung ist, ist eine schreckliche Idee, da diese Ausnahme aufgerufen wird, wenn es auch SQL-Syntax und tatsächliche Verbindungsfehler gibt.

Ich habe über die getPortableCode() - und getPortableMessage() - Methoden nachgedacht, die von der Ausnahmeklasse geerbt werden, um festzustellen, ob es eine Fremdschlüsseleinschränkung ist (was sie können), aber sie geben absolut keine Informationen über die Beschränkung selbst. Wenn beispielsweise eine bedingte Ausnahme ausgelöst wird, gibt getPortableCode() '-5' zurück und getPortableMessage() gibt 'bereits vorhanden' zurück. Zugegeben, ich könnte wahrscheinlich herausfinden, was fehlgeschlagen ist, und einen Fehler für meinen Benutzer auslösen, wenn es eine einzige Einschränkung gibt, aber natürlich habe ich die Dinge mit mehreren Einschränkungen kompliziert gemacht.

Wie auch immer, genug von meiner Wanderung, ich versuche herauszufinden, was andere Entwickler in meiner Situation tun ... Es scheint, als ob dies etwas in der glanzlosen "sanfte Einführung" sein sollte.

+1

Ich bin nicht wirklich sicher, was Sie erreichen möchten. Warum möchten Sie in Aktionen mit Fremdschlüsseln umgehen? Ist eine Formularvalidierung nicht das, wonach Sie suchen? –

Antwort

0

Die Antwort auf diese Frage hängt davon ab, was die Datenbankeinträge erstellt.

Wenn die Antwort eine Formularübermittlung ist, sollten Sie das Validierungssystem von Symfony verwenden. Doctrine stellt Validatoren zur Überprüfung bereit, ob eine Beziehung gültig ist oder ob ein Objekt existiert. Sehen Sie sich sfValidatorDoctrineChoice und sfValidatorDoctrineUnique an.

Wenn Sie die Datenbankeinträge nicht auf Basis von Benutzereingaben erstellen, besteht die Lösung darin, die Überprüfung entweder über einen Validator oder einen manuellen DB-Aufruf selbst durchzuführen. Ich nehme an, du könntest es auch versuchen.

+0

Ich verwende bereits Formularvalidierung für Benutzereingaben. Aber es gibt Daten, die in den Verifizierungsprozess einfließen, die ich aus irgendeinem Grund in den Validator eingeben kann. Am Ende überschrieb ich die Speichermethode des Modells, so dass überprüft wurde, ob diese bestimmten Spalten aktualisiert und dann verifiziert werden sollten. –

+0

Die Lösung, zu der ich kam, folgte genau diesem ... Es gibt wirklich keine "anmutige" Möglichkeit, mit den Fremdschlüsseln in der Business-Schicht umzugehen. Also verwende ich nur Validatoren, um die spezifische Einzigartigkeit sicherzustellen, die ich brauche, und alles, was in die Ritzen fällt, löst eine Ausnahme aus. Für einen viel saubereren Weg, Dinge zu tun, muss ich zugeben. –