porno porno izle rokettube
Ergebnis 1 bis 5 von 5

Thema: Frage zur Vorgehensweise mit Factories

  1. #1
    Neuer Benutzer
    Registriert seit
    28.07.2017
    Beiträge
    3
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard Frage zur Vorgehensweise mit Factories

    Hallo zusammen,

    ich würde gerne von euch erfahren, ob die folgende Vorgehensweise in Bezug auf Factories und Models so okay ist oder ob es einen "besseren Weg nach Rom" gibt
    Alle meine Models erben von der Klasse AbstractModel. Diese Klasse dient in erster (und einziger) Linie dazu, häufig benötigte Services zu kapseln und meinen Models zur Verfügung zu stellen:

    PHP-Code:
    <?php
    namespace Application\Model;

    use 
    Doctrine\ORM\EntityManager;
    use 
    Zend\Mvc\Plugin\FlashMessenger\FlashMessenger;
    class 
    AbstractModel {
      
      protected 
    $_entityManager;
      
      protected 
    $_flashMessenger;
      
      protected function 
    getEntityManager() : EntityManager {
        return 
    $this->_entityManager;
      }
      
      public function 
    setEntityManager(EntityManager $entityManager) {
        
    $this->_entityManager $entityManager;
      }
      
      protected function 
    getFlashMessenger() : FlashMessenger {
        return 
    $this->_flashMessenger;
      }
      
      public function 
    setFlashMessenger(FlashMessenger $flashMessenger) {
        
    $this->_flashMessenger $flashMessenger;
      }
    }
    Gesetzt werden diese Services über die Factories der einzelnen Models, wie hier das Beispiel der RegisterModelFactory:

    PHP-Code:
    <?php
    namespace User\Factory\Model;

    use 
    Interop\Container\ContainerInterface;
    use 
    User\Model\RegisterModel;
    use 
    Zend\ServiceManager\Factory\FactoryInterface;
    use 
    Doctrine\ORM\EntityManager;

    class 
    RegisterModelFactory implements FactoryInterface {

      public function 
    __invoke(ContainerInterface $containerInterface$requestedName, array $options null) {
        
    $registerEmailModel $containerInterface->get(RegisterEmailModel::class);
        
    $registerModel = new RegisterModel($registerEmailModel);
        
    $registerModel->setEntityManager($containerInterface->get(EntityManager::class));
        
    $registerModel->setFlashMessenger($containerInterface->get('ControllerPluginManager')->get('flashmessenger'));
        return 
    $registerModel;
      }
    }
    Die Services, welche ich nur in den einzelnen Models benötige, setze ich hingegen über den Konstruktor des Models, wie in der Factory zu sehen ist. Diese werden dann in einzelnen Klassenvariablen gehalten:

    PHP-Code:
    <?php
    namespace User\Model;

    use 
    Zend\Stdlib\Parameters;
    use 
    Application\Model\AbstractModel;

    class 
    RegisterModel extends AbstractModel {

      private 
    $_registerEmailModel;

      public function 
    __construct(RegisterEmailModel $registerEmailModel) {
        
    $this->_registerEmailModel $registerEmailModel;
      }

      public function 
    createUser(Parameters $post) : bool {}

      private function 
    _getRegisterEmailModel() : RegisterEmailModel {
        return 
    $this->_registerEmailModel;
      }
    }
    Technisch läuft alles einwandfrei, aber ich würde gerne Eure Meinung zu meiner Vorgehensweise hören

    Dankeschön und viele Grüße
    Michael

  2. #2
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.513
    Thanks
    3
    Thanked 352 Times in 283 Posts

    Standard

    Zitat Zitat von michga93 Beitrag anzeigen
    ich würde gerne von euch erfahren, ob die folgende Vorgehensweise in Bezug auf Factories und Models so okay ist oder ob es einen "besseren Weg nach Rom" gibt
    Ich kann leider nicht erkennen, welche Aufgabe dein Datenmodell übernimmt. Scheinbar werden Zuständigkeiten und Aufgaben in den Klassen vermischt. Wieso steht in jeder Klasse der „Entity Manager“ von Doctrine zur Verfügung? Die Abhängigkeit zum „Flash Messenger“ ist sogar falsch, denn es ist ein Kontroller-Plugin und hat ausserhalb eines Kontrollers nichts verloren. Zusätzlich bindest du damit dein Datenmodell an das ZF und hier konkret an das MVC-Muster. Auch werden falsche Bezeichnungen verwendet, denn „$post“ in der Methode „RegisterModel::createUser“ setzt scheinbar voraus, dass es sich die HTTP-Methode „POST“ handelt. Dies wird wiederum auch noch an „Zend\Stdlib\Parameters“ gebunden, wieder die Abhängigkeit zum ZF und MVC.
    Das pauschale zur Verfügung stellen von Funktionalitäten, egal ob dies benötigt werden oder nicht, ist grundsätzlich falsch. Das konkrete Problem, welches eine Klasse lösen soll, scheint damit nicht genau definiert zu sein. Die Idee des Datenmodells liegt nicht darin eine Klasse zu erstellen, welche alle Probleme löst. Daher ist auch der Name „Model“ für eine einzelne Klasse nicht korrekt.
    Du hast hier zwar nur einen kleinen Auszug gegeben, aber die Problematik zieht sich durch alle deine Klassen, wenn diese die Klasse „Application\Model\AbstractModel“ erweitern.

    Übrigens stimmt die Methodensignatur deiner Fabrik nicht ganz. (siehe im Interface)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  3. The Following User Says Thank You to Kaiuwe For This Useful Post:

    michga93 (01.08.2017)

  4. #3
    Neuer Benutzer
    Registriert seit
    28.07.2017
    Beiträge
    3
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Autsch, mit soviel hatte ich nicht gerechnet aber dafür habe ich ja den Thread geöffnet - Danke schonmal für deine Antwort! :-)

    Zitat Zitat von Kaiuwe Beitrag anzeigen
    Ich kann leider nicht erkennen, welche Aufgabe dein Datenmodell übernimmt. Scheinbar werden Zuständigkeiten und Aufgaben in den Klassen vermischt. Wieso steht in jeder Klasse der „Entity Manager“ von Doctrine zur Verfügung?
    Die Models beinhalten in erster Linie die CRUD Funktionalität der einzelnen Doctrine-Entities. Beispielsweise enthält das UserModel die Methoden getUserById(), editUser(), deleteUser(), usw. Aus diesem Grund wird der EntityManager auch über das AbstractModel zur Verfügung gestellt.

    Zitat Zitat von Kaiuwe Beitrag anzeigen
    Die Abhängigkeit zum „Flash Messenger“ ist sogar falsch, denn es ist ein Kontroller-Plugin und hat ausserhalb eines Kontrollers nichts verloren.
    Kann ich definitiv nachvollziehen, allerdings wusste ich es ehrlich gesagt nicht besser, da in einer einzelnen Model-Methode mehrere Flash-Messages erstellt werden müssen (Beispiel beim Anlegen eines Benutzers: Benutzer wurde erfolgreich angelegt [success] und Benutzer konnte nicht angelegt werden [error]). Der korrekte Weg ist wahrscheinlich, die Messages in einer lokalen Model - Variable zu speichern und dann im Controller auf diese zuzugreifen und in den FlashMessenger "zu schmeißen", richtig?

    Zitat Zitat von Kaiuwe Beitrag anzeigen
    Zusätzlich bindest du damit dein Datenmodell an das ZF und hier konkret an das MVC-Muster. Auch werden falsche Bezeichnungen verwendet, denn „$post“ in der Methode „RegisterModel::createUser“ setzt scheinbar voraus, dass es sich die HTTP-Methode „POST“ handelt. Dies wird wiederum auch noch an „Zend\Stdlib\Parameters“ gebunden, wieder die Abhängigkeit zum ZF und MVC.
    Für dieses Projekt ist derzeit nichts anderes geplant, als auf das MVC zu setzen (Keine Pipelines). Mir ist gerade noch nicht bewusst, was daran falsch ist, außer das bei einem Einsatz von Pipelines der Code nicht wiederverwendet werden kann.

    Zitat Zitat von Kaiuwe Beitrag anzeigen
    Übrigens stimmt die Methodensignatur deiner Fabrik nicht ganz.
    Da der Parameter $containerInterface $container heißen müsste, richtig?


    Nochmal herzlichen Dank für deine Antwort und deine künftigen Antworten :-)
    Michael

  5. #4
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.513
    Thanks
    3
    Thanked 352 Times in 283 Posts

    Standard

    Zitat Zitat von michga93 Beitrag anzeigen
    Die Models beinhalten in erster Linie die CRUD Funktionalität der einzelnen Doctrine-Entities. Beispielsweise enthält das UserModel die Methoden getUserById(), editUser(), deleteUser(), usw. Aus diesem Grund wird der EntityManager auch über das AbstractModel zur Verfügung gestellt.
    Das ist doch über die Repositories von Doctrine bereits geregelt. Brauchst du hier eigene Funktionalitäten, dann geht das ebenfalls über Doctrine. (siehe in der Doku unter „Custom Repositories“)
    Damit ist auch gleich der Name „Model“ aus deinen Klassen entfernt.

    Zitat Zitat von michga93 Beitrag anzeigen
    Der korrekte Weg ist wahrscheinlich, die Messages in einer lokalen Model - Variable zu speichern und dann im Controller auf diese zuzugreifen und in den FlashMessenger "zu schmeißen", richtig?
    Auch hier bringt Doctrine bereits etwas mit: „Events“. Bei der Verarbeitung innerhalb von Doctrine werden verschiedene Ereignisse ausgelöst. An diese Ereignisse kann man Zuhörer (Klassen) anheften und jeder Art von eigenen Aktionen ausführen. Zum Beispiel an den „Flash Messenger“ die gewünschten Nachrichten übergeben oder Mails versenden, Protokoll führen usw.
    Damit hast du wiederum eine Entkopplung innerhalb des Systems umgesetzt. (siehe ebenfalls beim Entwurfsmuster „Beobachter“)
    In der Doctrine-Dokumentation findest du alles unter „Events“ und für deinen Fall unter „Implementing Event Listeners“.

    Zitat Zitat von michga93 Beitrag anzeigen
    Für dieses Projekt ist derzeit nichts anderes geplant, als auf das MVC zu setzen (Keine Pipelines).
    Selbst wenn du weiterhin auf das MVC-Muster setzt, hast du eine Abhängigkeit zum ZF. Oder eine eine Abhängigkeit zu einer bestimmten Version einer Komponente. Ich erinnere an die Wechsel von ZF1 zu ZF2 und von ZF2 zu ZF3.

    Zitat Zitat von michga93 Beitrag anzeigen
    …außer das bei einem Einsatz von Pipelines der Code nicht wiederverwendet werden kann.
    Kann dir leider hier nicht folgen. Was soll man nicht wiederverwenden können? Wenn du mit „Pipelines“ auf „Middleware“ abzielst, dann ist genau der umgekehrte Fall korrekt: du erhöhst die Wiederverwendbarkeit.

    Zitat Zitat von michga93 Beitrag anzeigen
    Da der Parameter $containerInterface $container heißen müsste, richtig?
    Daumen hoch!
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  6. The Following User Says Thank You to Kaiuwe For This Useful Post:

    michga93 (02.08.2017)

  7. #5
    Neuer Benutzer
    Registriert seit
    28.07.2017
    Beiträge
    3
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Klasse, danke für die zahlreichen Informationen!! Damit kann ich den Code sicher so abändern, dass es auch im Sinne des Erfinders ist

Ähnliche Themen

  1. Frage zur Verzeichnisstruktur
    Von Marly im Forum Einsteigerfragen
    Antworten: 7
    Letzter Beitrag: 23.11.2010, 01:31
  2. Frage zur Übersetzung?
    Von klaus24 im Forum Lokalisierung & Internationalisierung
    Antworten: 9
    Letzter Beitrag: 27.07.2010, 15:44
  3. Frage zur Route
    Von klaus24 im Forum MVC
    Antworten: 6
    Letzter Beitrag: 03.05.2010, 19:06
  4. Frage zur Einbindung von js mit view helfer
    Von Johnny990 im Forum Javascript + RIA
    Antworten: 11
    Letzter Beitrag: 23.12.2009, 13:02
  5. Frage zur Layouterstellung
    Von pepe84 im Forum Einsteigerfragen
    Antworten: 5
    Letzter Beitrag: 02.09.2009, 20:28

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •