Voraussetzungen schaffen: eigenes Modul, db_schema.xml, Model/ResourceModel/Collection anlegen
Voraussetzungen schaffen: eigenes Modul, db_schema.xml, Model/ResourceModel/Collection anlegen
~8 Min. Lesezeit Zuletzt aktualisiert am 9. August 2026
Bevor ein Grid oder Formular überhaupt Daten anzeigen kann, braucht es etwas, das Daten hat: ein eigenes Modul mit einer Datenbanktabelle und den klassischen Model/ResourceModel/Collection-Klassen. Dieses Kapitel baut das Übungsmodul Mironsoft\Announcement auf, das die Blöcke 2 und 3 als Grundlage nutzen.
Modul-Grundgerüst
Grundstruktur des Übungsmoduls
app/code/Mironsoft/Announcement/
├── registration.php
├── composer.json
├── etc/
│ ├── module.xml
│ └── db_schema.xml
└── Model/
├── Announcement.php
└── ResourceModel/
├── Announcement.php
└── Announcement/
└── Collection.php<?php
declare(strict_types=1);
use Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(
ComponentRegistrar::MODULE,
'Mironsoft_Announcement',
__DIR__
);<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Mironsoft_Announcement" />
</config>db_schema.xml statt InstallSchema
Dieses Projekt nutzt konsequent das deklarative Schema statt InstallSchema/UpgradeSchema-Skripten. Statt imperativer PHP-Migrationen beschreibt eine db_schema.xml den gewünschten Endzustand der Tabelle - Magento berechnet beim Setup selbst, welche ALTER TABLE-Anweisungen nötig sind.
<?xml version="1.0"?>
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
<table name="mironsoft_announcement" resource="default" engine="innodb"
comment="Mironsoft Announcement Table">
<column xsi:type="int" name="announcement_id" padding="10" unsigned="true"
nullable="false" identity="true" comment="Announcement ID"/>
<column xsi:type="varchar" name="title" nullable="false" length="255"
comment="Title"/>
<column xsi:type="text" name="message" nullable="false" comment="Message"/>
<column xsi:type="smallint" name="is_active" padding="5" unsigned="true"
nullable="false" identity="false" default="1" comment="Is Active"/>
<column xsi:type="timestamp" name="created_at" on_update="false" nullable="false"
default="CURRENT_TIMESTAMP" comment="Created At"/>
<constraint xsi:type="primary" referenceId="PRIMARY">
<column name="announcement_id"/>
</constraint>
</table>
</schema>Achtung: Jede Änderung an db_schema.xml wird erst nach bin/magento setup:upgrade tatsächlich in der Datenbank angewendet - die Datei allein bewirkt nichts. Ein sehr häufiger Anfängerfehler ist, eine Spalte zu ergänzen und sich dann zu wundern, warum sie im Formular oder Grid nicht auftaucht, obwohl der PHP-Code sie längst referenziert.
Model, ResourceModel, Collection
Diese drei Klassen bilden den klassischen Magento-Datenzugriffs-Dreiklang: das Model repräsentiert einen einzelnen Datensatz, das ResourceModel kapselt Lesen/Schreiben in die Tabelle, und die Collection liefert Mengen von Datensätzen inklusive Filter- und Sortier-Fähigkeiten - genau das, was der DataProvider eines Grids später braucht.
<?php
declare(strict_types=1);
namespace Mironsoft\Announcement\Model;
use Magento\Framework\Model\AbstractModel;
use Mironsoft\Announcement\Model\ResourceModel\Announcement as AnnouncementResource;
/**
* Announcement entity model.
*/
class Announcement extends AbstractModel
{
/**
* Initializes the resource model.
*
* @return void
*/
protected function _construct(): void
{
$this->_init(AnnouncementResource::class);
}
}<?php
declare(strict_types=1);
namespace Mironsoft\Announcement\Model\ResourceModel;
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
/**
* Announcement resource model, maps the entity onto mironsoft_announcement.
*/
class Announcement extends AbstractDb
{
/**
* Initializes the main table and primary key column.
*
* @return void
*/
protected function _construct(): void
{
$this->_init('mironsoft_announcement', 'announcement_id');
}
}<?php
declare(strict_types=1);
namespace Mironsoft\Announcement\Model\ResourceModel\Announcement;
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
use Mironsoft\Announcement\Model\Announcement as AnnouncementModel;
use Mironsoft\Announcement\Model\ResourceModel\Announcement as AnnouncementResource;
/**
* Collection of announcement entities, used by grid DataProviders.
*/
class Collection extends AbstractCollection
{
/**
* Binds the collection to its model and resource model pair.
*
* @return void
*/
protected function _construct(): void
{
$this->_init(AnnouncementModel::class, AnnouncementResource::class);
}
}setup:upgrade ausführen
bin/magento setup:upgrade
bin/magento cache:cleanTipp: Nach jeder setup:upgrade-Ausführung lohnt sich ein kurzer Blick in bin/log setup.log oder die Konsolenausgabe selbst - fehlerhafte db_schema.xml-Angaben (zum Beispiel eine fehlende length bei varchar) werden dort sofort sichtbar, statt später als kryptischer SQL-Fehler beim Speichern eines Formulars aufzutauchen.
Mit diesen drei Klassen und der Tabelle steht die Datenbasis. Kapitel 3 ergänzt ACL und einen Admin-Menüpunkt, danach kann in Block 2 der erste Grid entstehen.