Ergebnis 1 bis 8 von 8

Thema: Symfony Entity für bereits existierende Contao Tabellen

  1. #1
    Contao-Nutzer
    Registriert seit
    14.03.2012.
    Ort
    Berlin
    Beiträge
    225

    Frage Symfony Entity für bereits existierende Contao Tabellen

    Hallo zusammen,

    ich habe ein Projekt mit einigen Entities über Doctrine ORM, um mir die Arbeit mit meinen Models zu erleichtern. Ich nutze keine Contao Models mehr. Ich bin davon ausgegangen, dass dies ein guter Ansatz ist, da die ja irgendwann ersetzt werden sollen.

    Eigentlich funktioniert das auch ganz gut. Ich habe meine DCA Files und daneben meine Entities.
    Problem sind nun aber existierende Contao Tabellen, die ich erweitern und auch über eine Entity-Klasse ansprechen möchte (wichtig auch für die abhängigen Tabellen).
    Einfaches Beispiel wäre eine tl_member.php in der ein Feld hinzugefügt wird. Daneben habe ich eine Entity/Member.php erstellt, welche alle bisherigen bzw. für mich relevanten Felder sowie mein neues Feld beinhaltet.
    Wenn ich dann contao/install aufrufe, erscheint jedoch eine (Symfony) Fehlermeldung, dass die Tabelle tl_member bereits existiert (SchemaException: The table with name db.tl_member already exists.).

    Hat jemand eine Ahnung, woran das liegt & was ich machen kann?
    Unter Contao 4.3 funktionierte dies übrigens noch ohne Probleme!

    Würde mich über Anregungen freuen!

  2. #2
    Contao-Fan Avatar von eS_IT
    Registriert seit
    21.07.2010.
    Ort
    Werne a. d. Lippe
    Beiträge
    585
    Partner-ID
    6161
    User beschenken
    Wunschliste

    Standard

    Hallo jk1,

    das Problem liegt daran, dass in Symfony die Datenbank über die Entities gepflegt wird und in Contao über das DCA. Da Contao 4 nun ein bisschen von beidem ist, will es beide Varianten berücksichtigen. Du kannst also bei Deine eigenen Tabellen entweder die SQL-Definition wie bisher ins DCA schreiben, oder aber in ein Entity auslagern. Das Problem bei bestehenden Tabellen ist nun aber, dass die SQL-Definitionen schon im DCA stehen. Wenn Du nun ein Entity anlegst, kommt die Fehlermeldung, dass die Tabellen schon vorhanden sind, da es ja für eine Tabelle dann zwei Definitionen (DCA und Entity) gibt.

    Eine Lösung ist mir leider auch nicht bekannt. Wenn aber jemand mehr weiß, würde es mich auch interessieren.

    Viele Grüße,
    eS_IT
    Viele Grüße,
    eS_IT
    --
    e@sy Solutions IT - Ihr Partner für professionelle Softwareentwicklung
    Website - Contao Codebook - Partnerprofil - GitHub

  3. #3
    Contao-Nutzer
    Registriert seit
    14.03.2012.
    Ort
    Berlin
    Beiträge
    225

    Standard

    Hallo eS_IT,

    danke für die Erläuterung! Schade das es in 4.3 funktionierte - aber damit muss man ja rechnen ;-)

    Jetzt wo du das sagst, meine ich auch mal was darüber gelesen zu haben. Wenn ich also aus meinen DCA Files die SQL Definitionen rausnehme, dürfte es trotzdem noch funktionieren, da er sich die Definition nun automatisch aus der Entity holt, richtig? Wundert mich nur etwas, dass es dann bei eigenen Tabellen auch funktioniert, wenn es an beiden Stellen definiert wurde. Aber das wird wahrscheinlich irgendwie gemerged...

    Theoretisch müsste man nun versuchen die Nutzung der ursprünglichen tl_member.php aus dem Core abzuklemmen & alles in seine eigene schreiben. Wird ja aber lustig, wenn man ein paar mehr Erweiterungen hat, welche die gleichen Tabellen nutzen bzw. erweitern. Aber mein Vorgehen ist noch jetzt nicht sehr sonderbar, oder? In dem Fall muss hier ja irgendwann eine Lösung her

    BG

  4. #4
    Contao-Fan Avatar von eS_IT
    Registriert seit
    21.07.2010.
    Ort
    Werne a. d. Lippe
    Beiträge
    585
    Partner-ID
    6161
    User beschenken
    Wunschliste

    Standard

    Hallo jk1!

    Zitat Zitat von jk1 Beitrag anzeigen
    Wenn ich also aus meinen DCA Files die SQL Definitionen rausnehme, dürfte es trotzdem noch funktionieren, da er sich die Definition nun automatisch aus der Entity holt, richtig?
    So ist es.

    Zitat Zitat von jk1 Beitrag anzeigen
    Theoretisch müsste man nun versuchen die Nutzung der ursprünglichen tl_member.php aus dem Core abzuklemmen & alles in seine eigene schreiben.
    Ich halte grundsätzlich für eine schlechte Idee den Core zu ändern, aber möglich wäre es.

    Zitat Zitat von jk1 Beitrag anzeigen
    Aber mein Vorgehen ist noch jetzt nicht sehr sonderbar, oder?
    Ja und nein. Es ist halt nicht Contao. In Contao würde man die Models verwenden. Es ist halt eher Symfony (was ich sehr gut verstehen kann ). Das funktioniert aber halt mit Contao (noch) nicht so richtig. Wir bewegen uns im Augenblick ein bisschen zwischen zwei Welten.

    Wie gesagt, eine richtig saubere Lösung habe ich leider auch nicht.

    Viele Grüße,
    eS_IT
    Viele Grüße,
    eS_IT
    --
    e@sy Solutions IT - Ihr Partner für professionelle Softwareentwicklung
    Website - Contao Codebook - Partnerprofil - GitHub

  5. #5
    Contao-Nutzer
    Registriert seit
    14.03.2012.
    Ort
    Berlin
    Beiträge
    225

    Standard

    Zitat Zitat von eS_IT Beitrag anzeigen
    Ich halte grundsätzlich für eine schlechte Idee den Core zu ändern, aber möglich wäre es.
    Daher das "Theoretisch" - keine Sorge, habe ich nicht vor

    Zitat Zitat von eS_IT Beitrag anzeigen
    Wie gesagt, eine richtig saubere Lösung habe ich leider auch nicht.
    Falls du noch eine unsaubere Lösung hast, bin ich zumindest nicht abgeneigt darüber zu diskutieren!


    Falls sich jemand genauer mit dem Entwicklungsstand dieser Thematik auskennt, wäre es für mich interessant zu wissen, ob sowas überhaupt noch eine Chance hätte in eine 4.4.x Version zu fließen, oder ob das eher was für die 4.8 oder gar 5er wäre.
    Wenn es hierfür tatsächlich keine Lösung gibt, bleiben mir eigentlich nur folgende Möglichkeiten ohne den Core zu ändern:
    - Weiterhin die 4.3'er nutzen
    - Versuchen, nur meine eigenen Tabellen über Entities abzubilden. Aus dem Core nutze ich glaube ich nur die tl_members. Ich vermute aber, dies wird sehr schwierig, da ich einige abhängige Member Tabellen habe (tl_member_xyz), die wiederum mit der tl_member gemappt sind. Und wenn die nicht auch anders herum in einer tl_members Entity gemappt werden, habe ich jede Menge invalide Entities.

    BG

  6. #6
    Contao-Nutzer
    Registriert seit
    14.03.2012.
    Ort
    Berlin
    Beiträge
    225

    Beitrag Lösung

    Guten Abend,

    ich habe eine Lösung für das Problem gefunden. Ob weitere Probleme entstehen, kann ich noch nicht sagen. Werde mich aber melden, falls ich auf welche stoßen sollte.
    Meine ersten Tests funktionieren jedoch ohne Probleme. Ob dies eine saubere Lösung ist, darf jeder für sich entscheiden

    Und zwar wird ein EventListener benötigt, der die doppelt definierten Tabellen wieder raus haut.

    1. Den Doctrine Event-Listener "postGenerateSchemaTable" registrieren:
    Acme\TestBundle\Resources\config\services.yml

    Code:
    services:
      acme.post_generate_schema_table:
        class: Acme\TestBundle\EventListener\PostGenerateSchemaTable
        tags:
          - {name: doctrine.event_listener, event: postGenerateSchemaTable }

    2. Die Klasse erstellen:
    Acme\TestBundle\EventListener\PostGenerateSchemaTa ble.php

    PHP-Code:
    <?php

    namespace Acme\TestBundle\EventListener;

    use 
    Doctrine\ORM\Tools\Event\GenerateSchemaTableEventArgs;

    /**
     * Class PostGenerateSchemaTable
     * @package Acme\TestBundle\EventListener
     */
    class PostGenerateSchemaTable
    {

      
    /**
       * @var EntityManager
       */
      
    private $entityManager;

      
    /**
       * @var Array
       * Definition of the entities used inside your contao application
       * (should preferably be outsourced)
       */
      
    private $ignoredEntities = [
        
    'Acme\TestBundle\Entity\Member'// -> tl_member
        
    'Acme\TestBundle\Entity\Foo',
        
    'Acme\TestBundle\Entity\Bar',
      ];

      
    /**
       * Remove ignored tables / entities from schema
       *
       * @param GenerateSchemaTableEventArgs $args
       */
      
    public function postGenerateSchemaTable(GenerateSchemaTableEventArgs $args)
      {

        
    $this->entityManager = \System::getContainer()->get('doctrine.orm.entity_manager');
        
    $schema $args->getSchema();
        
    $databaseName $this->entityManager->getConnection()->getDatabase();

        
    $ignoredTables = [];
        foreach (
    $this->ignoredEntities as $entityName) {
          
    $ignoredTables[] = $databaseName '.' $this->entityManager->getClassMetadata($entityName)->getTableName();
        }

        foreach (
    $schema->getTableNames() as $tableName) {
          if (
    in_array($tableName$ignoredTables)) {
            
    // remove table from schema
            
    $schema->dropTable($tableName);
          }

        }

      }

    }

    Credits gehen definitiv an http://kamiladryjanek.com/en/ignore-...pdate-command/ - obwohl es nicht in diesem Fall nicht wie dort beschrieben funktioniert.

    BG

  7. #7
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    BTW: Das Core Team begrüsst jegliche Pull Requests die die Zusammenarbeit mit Doctrine erleichtern. Wie du vielleicht festgestellt hast, nutzen wir alle auch Doctrine für Nicht-Contao-Projekte und deswegen finden sich schon einige Brücken in Contao (DB Schema versteht Contao DCA, du kannst die SQL Definition mit Doctrine DBAL Arrays schreiben, Doctrine Migrations funktioniert einwandfrei etc.).

    Es gibt halt viele Probleme, die sich stellen:

    • Doctrine entities sind nicht erweiterbar bzw. evtl. mit Single Table Inheritance aber im Contao Umfeld wollen halt viele Erweiterungen die selbe Tabelle erweitern und das muss möglich sein (also evtl. Entity Generator)
    • Wir haben static Dependencies auf allen Models (also \PageModel::findByFoobar()) und das muss aus BC Gründen auch weiterhin funktionieren. Man müsste also wohl das Model so anpassen, dass es wie eine Facade funktioniert
    • In Contao-Erweiterungen gibt es tausende von "instanceof Model" comparisons (bzw. halt TypeHints)
    • etc. pp.


    Mir würde bestimmt noch mehr einfallen, wenn ich mir länger Gedanken machen würde. Aber es wär schon cool, wenn alles alte weiterhin funktioniert, aber ich in neuem Code den Entity Manager nutzen kann.
    Wir können jegliche Unterstützung gebrauchen
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  8. #8
    Contao-Nutzer
    Registriert seit
    13.03.2019.
    Beiträge
    40

    Standard

    Es scheint, als würde die postGenerateSchemaTable Lösung ab Contao 4.6 (oder den dazugehören höheren Doctrine-Versionen?) nicht mehr funktionieren.
    Ich versuche zur Zeit unsere bestehenden Erweiterungen ins neue 4.9 zu intergrieren, und bekomme über den migrate Consolenbefehl nun auch wieder die Meldung, dass die tl_content schon existiert. Hat vielleicht jemand, der auch das Problem für 4.4 auch mit postGenerateSchemaTable behoben hat, eine Idee, was man da machen könnte?

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

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