Tabellennamen mit Doctrine dynamisch anpassen

in  Zikula Apps , ,

Tabellennamen mit Doctrine dynamisch anpassen

Mit Hilfe der Metadaten von Doctrine lassen sich jegliche Daten zu einer Entität zur Laufzeit verändern. Allerdings kann das in manchen Anwendungsfällen fortwährend notwendig sein, zum Beispiel in Multi-Tenancy-Umgebungen. Wenn zudem Operationen mit dem Schema Manager in der Datenbank benötigt werden, kann es schnell unübersichtlich werden, da man sich nicht sicher sein kann, ob eine bestimmte Veränderung bereits durchgeführt worden ist oder noch nicht.

Der folgende Code-Ausschnitt zeigt ein Beispiel für eine Klasse, die eine Modifikation zentral für alle Entitäten, die für einen bestimmten EntityManager registriert sind, durchführt - hier wird etwa der Name der durch die Entität angesprochenen Datenbanktabelle verändert:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php

declare(strict_types=1);

namespace App\Common\ORM;

use Doctrine\Persistence\ManagerRegistry;

class TenantConfigurator
{
    private ManagerRegistry $registry;
    private bool $isTenantSet = false;
    private array $originalTableNames = [];

    public function __construct(
        ManagerRegistry $registry
    ) {
        $this->registry = $registry;
    }

    public function process(string $tenantPrefix, string $managerName = 'datastore'): void
    {
        $entityManager = $this->registry->getManager($managerName);
        $metaData = $entityManager->getMetadataFactory()->getAllMetadata();

        if (!count($this->originalTableNames)) {
            foreach ($metaData as $meta) {
                $this->originalTableNames[$meta->getName()] = $meta->getTableName();
            }
        }

        foreach ($metaData as $meta) {
            $meta->setPrimaryTable(
                [
                    'name' => $tenantPrefix . '_' . $this->originalTableNames[$meta->getName()],
                ]
            );
        }

        $this->isTenantSet = true;
    }

    public function isTenantSet(): bool
    {
        return $this->isTenantSet;
    }
}

Diese Methode lässt sich beispielsweise in einem EventSubscriber aufrufen, der auf das RequestEvent von Symfony reagiert.

Weitere Beiträge in Kategorie Zikula Apps

Kommende Neuerungen in Symfony 6.4
- Die Veröffentlichung der nächsten Symfony-Version 6.4 steht bevor. Wie immer gibt es regelmäßige Einblicke in die wichtigsten, zu erwartenden Features und Verbesserungen. Dieser Beitrag zeigt im …
Symfony vereinfacht zeitgesteuerte Aktionen mit neuer Scheduler-Komponente
- Mit Symfony 6.3 sind wieder allerhand neue Features hinzugekommen. In diesem Beitrag möchte ich kurz die neue Komponente Scheduler vorstellen, mit welcher der Symfony Messenger um zeitgesteuerte …
SSO mit Keycloak und Symfony
- Mit der Java-basierten Software Keycloak wird die Verwaltung und Authentifizierung von Nutzern zentral gelöst. Hierbei bleiben kaum Wünsche offen: egal ob nun ein Registrierungsprozess, die …
Symfony UX Translator bietet Mehrsprachigkeit in JavaScript
- Bereits seit einigen Jahren gibt es das BazingaJsTranslationBundle, welches es erlaubt, den Symfony Translator auch Client-seitig zu verwenden. Auch in Zikula kommt dieses Bundle zum Einsatz, …
Kommende Neuerungen in Symfony 6.3
- Die Veröffentlichung der nächsten Symfony-Version 6.3 ist für Ende Mai 2023 geplant. Wie immer gibt es regelmäßige Einblicke in die wichtigsten, zu erwartenden Features und Verbesserungen. Dieser …