Eigene Entities & die DAL

Eigene Daten speichern

Sobald ein Plugin eigene Daten speichern soll, kommt die Data Abstraction Layer (DAL) ins Spiel – Shopwares eigener Weg, mit der Datenbank zu arbeiten. Statt direktem SQL beschreibt man Entities und greift über Repositories zu.

Die Tabelle: eine Migration

Datenbank-Änderungen laufen über versionierte Migrationen unter src/Migration/. Sie werden bei der Installation und bei Updates automatisch ausgeführt.

<?php declare(strict_types=1);

namespace Swag\Example\Migration;

use Doctrine\DBAL\Connection;
use Shopware\Core\Framework\Migration\MigrationStep;

class Migration1700000000Example extends MigrationStep
{
    public function getCreationTimestamp(): int
    {
        return 1700000000;
    }

    public function update(Connection $connection): void
    {
        $connection->executeStatement('
            CREATE TABLE IF NOT EXISTS `swag_example` (
                `id`         BINARY(16)  NOT NULL,
                `name`       VARCHAR(255) NOT NULL,
                `created_at` DATETIME(3) NOT NULL,
                `updated_at` DATETIME(3) NULL,
                PRIMARY KEY (`id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
        ');
    }

    public function updateDestructive(Connection $connection): void
    {
    }
}

Die Entity: eine Definition

Eine EntityDefinition verbindet Tabelle und DAL. Sie beschreibt die Felder – Shopware kümmert sich um Laden, Schreiben und Suchen.

public function defineFields(): FieldCollection
{
    return new FieldCollection([
        (new IdField('id', 'id'))->addFlags(new PrimaryKey(), new Required()),
        (new StringField('name', 'name'))->addFlags(new Required()),
    ]);
}

Zugriff über das Repository

Gelesen und geschrieben wird über das automatisch bereitgestellte Repository – nie mit direktem SQL:

$this->repository->create([
    ['id' => Uuid::randomHex(), 'name' => 'Beispiel'],
], $context);

Warum der Umweg? Die DAL bringt Events, Berechtigungen, Übersetzungen und Versionierung mit. Direktes SQL umgeht all das – und damit halbe Shopware.

Damit schließt sich der Kreis: Struktur, Lebenszyklus, Services, Events, Konfiguration, Storefront und eigene Daten – das Fundament für eigene Shopware-6-Plugins steht.