Doctrine Entity erweitern, um Geschäftslogik hinzuzufügen

8

Ich versuche, ein gutes Design zu üben und Doctrine zu erweitern. Meine erweiterte Klasse, das Modell im Grunde, wird eine zusätzliche Geschäftslogik + Zugriff auf die Basisdaten der Entität haben.

Ich verwende Doctrine 2.2.1 & amp; Zend Framework 1.11.4 & amp; PHP 5.3.8

Wenn ich DQL verwende, gibt Doktrine erfolgreich die Model-Entität zurück. Wenn ich die native find () - Funktion von Doctrine verwende, gibt es nichts zurück: (.

Hilfe ...

So rollt es:

Bootstrap.php :

%Vor%

Modell in APPLICATION_PATH \ models \ User.php :

%Vor%

Entity Retrieval Funktionen :

FUNKTIONIERT NICHT :

%Vor%

FUNKTIONIERT :

%Vor%     
ohadwkn 29.08.2012, 14:06
quelle

3 Antworten

4

Sie sollten den Entitäten keine Geschäftslogik hinzufügen, stattdessen sollten Sie dafür Modelle verwenden. Eine Möglichkeit wäre:

  1. Verwenden Sie Modelle für Geschäftslogik.
  2. Erstellen Sie benutzerdefinierte Doctrine 2-Repositorys für all Ihre Datenbankabfragen (DQL oder andere) [1].
  3. Lassen Sie Ihre Entitäten in Ruhe.

In der Praxis bedeutet dies, dass Modelle einfache PHP-Klassen sind (oder vielleicht Framework erweitert, je nachdem, was Sie verwenden), aber Ihre Modelle haben keine Beziehung zu Ihrer Datenbank. Ihre Modelle instanzieren jedoch Ihre benutzerdefinierten Doctrine 2-Repositories. Z.B. a UserRepository könnte eine Methode namens getUserById enthalten. In Ihren Repositorys führen Sie Ihre tatsächlichen Abfragen aus und geben Entitätsinstanzen zurück, mit denen die Modelle arbeiten können.

[1] Ссылка

    
Luke 07.08.2013 02:34
quelle
1

Wie ich Doctrine verstehe, ist entityManager nur für persistente Entitäten verantwortlich, und das Erweitern von Entities\User entity mit Model\User erstellt eine andere Entität (gespeichert in der gleichen Tabelle wie im Docblock angegeben), aber nicht von entityManager oder in Konflikt damit, weil Sie wahrscheinlich @InheritanceType("SINGLE_TABLE") in Entities\User docblocks:

nicht erwähnt haben

Lesen Sie diese Dokumentation für weitere Informationen Ссылка

    
Ivan Hušnjak 29.08.2012 14:30
quelle
0

Was ich versuchte, war eine schlechte Übung. Ich koppelte meine DB-Entity und Tools von Zend als @Ivan Hušnjak erwähnt.

Was getan werden sollte, ist die Abkopplung.

Geschäftslogik sollte in services \ controller sein und diese sollte die Entität und ihre Methoden adressieren. Sie können der Doktrineinheit Hilfsfunktionen hinzufügen, die nur mit den Entitätseigenschaften in Beziehung stehen.

Was meinen Hauptzweck betrifft (um eine Entity-Klasse zu haben, die die Doctrine CLI überschreiben und aktualisieren kann): Doktrin sucht nur nach Änderungen in den nativen Feldern \ Methoden, aktualisiert sie entsprechend und verwirft alle anderen Funktionen (Helfer). Es gibt also kein Problem, wenn die Doktrin die PHP-Entität aktualisieren lässt!

ps. gehe zu symfony2.

    
ohadwkn 05.02.2013 12:15
quelle