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.