diversworld/contao-dw-api-bundle
Composer 安装命令:
composer require diversworld/contao-dw-api-bundle
包简介
API-Bundle für den Contao Diveclub Manager zur Kommunikation mit der iOS-App (https://apps.apple.com/de/app/diveclub-manager/id6759004094). Ermöglicht die Verwaltung von Events, Reservierungen, Ausrüstung und Kursfortschritten.
关键字:
README 文档
README
iOS App https://apps.apple.com/de/app/diveclub-manager/id6759004094
Contao Diveclub API Bundle
API Bundle für die Kommunikation zwischen Contao und einer iOS App im Rahmen des Diveclub Managers.
Features
- Events: Abfrage von Tauchkursen und Terminen.
- Event-Terminpläne: Eigener Endpunkt für den vollständigen Zeitplan einer Kursveranstaltung.
- Reservierungen: Verwaltung von Buchungen (Ansehen und Erstellen).
- Ausrüstung: Zugriff auf Leihausrüstung (Jackets, Anzüge, etc.).
- Tauchflaschen & Atemregler: Spezielle Endpunkte für Flaschen und Regler.
- TÜV-Checks: Übersicht über anstehende Revisionen und Prüfvorschläge.
- App-Konfiguration & News: Bereitstellung von Logo, Info-Texten und Nachrichten für die iOS-App.
- Schüler: Verwaltung von Kursteilnehmern.
- Mitglieder: Abruf der Mitgliederliste (ID, Nachname, Vorname, E-Mail).
- Instruktoren & Dashboard: Freigaben für Kursanmeldungen, Fortschrittsdaten und Trainingsmanager-Dashboard.
- JSON-Format: Alle Antworten sind für die einfache Integration in iOS optimiert.
JSON-Format & Datentypen
- Datumswerte: Alle Datumsfelder (z. B.
tstamp,reserved_at,picked_up_at,returned_at,lastOrder,buyDate) werden einheitlich als Integer-Timestamp zurückgegeben. - Preise: Preis- und Gebührenfelder (z. B.
rentalFee,totalPrice,price) werden explizit als Float zurückgegeben. - Modelle: Die Endpunkte geben grundsätzlich alle Felder der zugrundeliegenden Datenbank-Tabellen zurück (
model->row()).
API Endpunkte
Alle Endpunkte befinden sich unter dem Präfix /api.
Events
GET /api/events: Liste aller Kurse/Events.GET /api/events/{id}: Details zu einem bestimmten Event.GET /api/events/{id}/schedule: Vollständiger Terminplan einer Kursveranstaltung.- Enthält alle Datensätze aus
tl_dc_course_event_schedule. - Ergänzt je Termin zusätzlich den aufgelösten
module_title.
- Enthält alle Datensätze aus
Reservierungen
GET /api/reservations: Liste aller Reservierungen des angemeldeten Benutzers.GET /api/reservations/{id}: Details inkl. aller gebuchten Items.- Gibt bei Items auch die Timestamps
created_atundupdated_atzurück.
- Gibt bei Items auch die Timestamps
POST /api/reservations: Neue Reservierung erstellen.- Erwartet JSON mit
member_id, optionalreservedFor,asset_type(z.B.equipment,tank,regulator,multiple) und einer Liste vonitems. - Bei
itemskönnen zusätzlichitem_id,item_type,types,sub_typeundnotesübergeben werden. - Beispiel Request:
{ "member_id": 1, "reservedFor": 1, "asset_type": "multiple", "items": [ { "item_id": 42, "item_type": "equipment", "types": "jacket", "sub_type": "m", "notes": "Größe M bitte" }, { "item_id": 12, "item_type": "tank", "notes": "12L Stahl" } ] }
- Erwartet JSON mit
Kurse
GET /api/courses: Liste der veröffentlichten Kursveranstaltungen austl_dc_course_event; ein leeresdateEndgilt als laufender Kurs.GET /api/courses/{id}: Details zu einer Kursveranstaltung austl_dc_course_event.POST /api/courses/enroll: Anmeldung zu einem Kurs.- Erwartet JSON mit
course_idund optionalevent_id.
- Erwartet JSON mit
Kursanmeldungen
GET /api/enrollments: Liste der Kursanmeldungen des aktuell angemeldeten Benutzers.
Instruktoren
GET /api/instructor/dashboard: Dashboard für den konfigurierten Trainingsmanager.- Liefert zwei Hauptbereiche:
courses: Liste aller veröffentlichten Kursveranstaltungen mit Kursname, Zeitraum, Instruktor und allen zugeordneten Schülern.workload: Aggregierte Anzahl der Veranstaltungen pro Instruktor.
- Jeder Schüler-Eintrag enthält u. a.:
namestatusprogress(Prozent)completed/totaldetailsmit Modulen und Übungsstatus
- Zugriff nur für das in
tl_dc_config.training_managerkonfigurierte Mitglied.
- Liefert zwei Hauptbereiche:
PATCH /api/instructor/approve/{id}: Kursanmeldung eines Schülers genehmigen (Status aufactivesetzen).PATCH /api/instructor/reject/{id}: Kursanmeldung eines Schülers ablehnen (Status aufdroppedsetzen).
Kursfortschritt
GET /api/progress: Kursfortschritt des aktuell angemeldeten Schülers.GET /api/progress/instructor: (Instruktoren) Liste der Schüler und deren Fortschritte für alle betreuten Kurse/Events.PATCH /api/progress/{exerciseId}: (Instruktoren) Übung als abgeschlossen markieren oder Notizen hinzufügen.- Erwartet JSON mit
status,dateCompleted(Timestamp) und optionalnotes.
- Erwartet JSON mit
Leihausrüstung
GET /api/equipment: Liste der allgemeinen Ausrüstung.- Enthält nun zusätzliche Felder:
types,sub_type,type_label,sub_type_label,manufacturer_label,size_labelundstatus_label.
- Enthält nun zusätzliche Felder:
GET /api/equipment/{id}: Details zu einem Ausrüstungsgegenstand.- Enthält nun zusätzliche Felder:
types,sub_type,type_label,sub_type_label,manufacturer_label,size_labelundstatus_label.
- Enthält nun zusätzliche Felder:
GET /api/equipment/options: Liste aller verfügbaren Optionen für Ausrüstung (Typen, Hersteller, Größen).- Gibt ein JSON-Objekt mit den Schlüsseln
types,manufacturersundsizeszurück.
- Gibt ein JSON-Objekt mit den Schlüsseln
GET /api/sizes/options: Reduzierter Options-Endpunkt für Größen und Hersteller.- Gibt ein JSON-Objekt mit den Schlüsseln
sizesundmanufacturerszurück.
- Gibt ein JSON-Objekt mit den Schlüsseln
Tauchflaschen (Tanks)
GET /api/tanks: Liste der verfügbaren Tauchflaschen.- Sichtbarkeit: Administratoren sehen alle Flaschen. Angemeldete Nutzer sehen ihre eigenen Flaschen (Status
owned) sowie alle veröffentlichten Flaschen mit dem Statusavailable. Gäste sehen alle veröffentlichten Flaschen. - Filterung: Unterstützt den Query-Parameter
status.status=available: Liefert alle veröffentlichten Flaschen mit dem Statusavailable(z. B. für die Equipment-Auswahl).status=owned: Liefert alle Flaschen mit dem Statusowned, die dem aktuell angemeldeten Mitglied gehören (z. B. für TÜV-Reservierungen). Erfordert Authentifizierung.
- Sichtbarkeit: Administratoren sehen alle Flaschen. Angemeldete Nutzer sehen ihre eigenen Flaschen (Status
GET /api/tanks/{id}: Details zu einer bestimmten Flasche.- Sicherheit: Nur für Administratoren, den Besitzer oder bei öffentlicher Markierung zugänglich.
POST /api/tanks: Neue Flasche anlegen.- Pflichtfelder:
title,serialNumber,size. - Besonderheit: Der angemeldete Nutzer wird automatisch als Besitzer (
owner) gesetzt, falls nicht anders angegeben.
- Pflichtfelder:
PUT/PATCH /api/tanks/{id}: Bestehende Flasche aktualisieren.- Sicherheit: Nur für Administratoren oder den Besitzer der Flasche erlaubt.
DELETE /api/tanks/{id}: Flasche löschen.- Sicherheit: Nur für Administratoren oder den Besitzer der Flasche erlaubt.
GET /api/tanks/options: Liste aller verfügbaren Optionen für Tauchflaschen (Größen, Hersteller).
Verfügbare Felder beim Speichern (Tanks):
Folgende Felder können via POST oder PUT/PATCH übertragen werden:
title, alias, status, rentalFee, serialNumber, manufacturer, bazNumber, size, o2clean, owner,
checkId, lastCheckDate, nextCheckDate, lastOrder, addNotes, notes, published, start, stop.
Atemregler
GET /api/regulators: Liste aller Atemregler.GET /api/regulators/{id}: Details zum Atemregler.GET /api/regulator/options: Liste aller verfügbaren Optionen für Atemregler (Hersteller, Modelle 1. & 2. Stufe).
TÜV Prüfungen
GET /api/students: Liste der registrierten Schüler.GET /api/students/{id}: Schülerdetails.GET /api/tank-checks: Liste der TÜV-Prüfvorschläge.GET /api/tank-checks/{id}: Details zum Prüfvorschlag inkl. verknüpfter Artikel.POST /api/tank-checks/book: Buchung einer TÜV-Prüfung für eine oder mehrere Flaschen.- Erwartet JSON mit
proposal_idund einer Liste vonitems(Flaschendaten und gewählte Artikel-IDs). - Optional unterstützt:
notesauf Buchungsebene sowienotesje Item/Flasche. - Rückgabe: Enthält den
total_priceder Buchung sowie eine Liste deritemsmit der berechnetentotalPricepro Flasche. - Beispiel Request:
{ "proposal_id": 12, "notes": "Bitte Rückruf bei Rückfragen.", "items": [ { "serialNumber": "ABC123", "manufacturer": "Scubatech", "bazNumber": "B12345", "size": "12", "price": 25.00, "o2clean": true, "articles": [1, 3, 5], "notes": "Ventil klemmt gelegentlich" } ] } - Beispiel Response:
{ "success": true, "booking_number": "B-20260213-140700-123", "total_price": 45.50, "items": [ { "serialNumber": "ABC123", "totalPrice": 45.50 } ] }
- Erwartet JSON mit
Authentifizierung
POST /api/login: Login für Frontend-Benutzer.- Erwartet JSON mit
usernameundpassword. - Gibt bei Erfolg Benutzerdaten inkl.
roleundisTrainingManagerzurück. - Prüft, ob die API in der
tl_dc_configaktiviert wurde.
- Erwartet JSON mit
POST /api/logout: Logout für Frontend-Benutzer.- Beendet die aktuelle Session.
GET /api/me: Aktuelle Benutzerdaten inkl.roleundisTrainingManagerabrufen.- Erfordert eine aktive Session.
PATCH /api/me: Eigene Benutzerdaten aktualisieren.- Erwartet JSON mit den zu ändernden Feldern (z.B.
firstname,lastname,email, etc.). - Erfordert eine aktive Session.
- Erwartet JSON mit den zu ändernden Feldern (z.B.
PATCH /api/me/password: Passwort ändern.- Erwartet JSON mit
currentPasswordundnewPassword. - Erfordert eine aktive Session.
- Erwartet JSON mit
Die Rolle role in den Antworten von POST /api/login und GET /api/me wird aus den in
tl_dc_config.instructor_groups
konfigurierten Frontend-Gruppen ermittelt. Mitglieder aus diesen Gruppen erhalten die Rolle instructor, alle anderen
member.
Das Feld isTrainingManager ist true, wenn die angemeldete Person der in tl_dc_config.training_manager
konfigurierte
Training Manager ist.
App & News
GET /api/app/config: Liefert die globale App-Konfiguration (API-Status, Logo-Pfad, Info-Text, Impressum, Datenschutz, Nutzungsbedingungen, News-Archiv-ID).GET /api/app/news: Liste der News aus dem konfigurierten Archiv (inkl. Headline, Teaser und Vorschaubild).- Unterstützt Query-Parameter:
archive=[1,2](Liste von Archiv-IDs) undlimit=4(Anzahl der Einträge).
- Unterstützt Query-Parameter:
GET /api/app/news/{id}: Details zu einer News-Meldung.- Enthält nun zusätzlich ein
imagesArray mit Pfaden zu allen Bildern aus den Inhaltselementen.
- Enthält nun zusätzlich ein
GET /api/app/news/details?id={id}: Details zu einer News-Meldung via Query-Parameter.
Mitglieder
GET /api/members: Liste aller Mitglieder.- Antwortfelder:
member_id,name(Nachname),vorname,email. - Gibt ein leeres Array zurück, wenn die API in der Diveclub-Konfiguration nicht aktiviert ist (
activateApi = trueerforderlich).
- Antwortfelder:
- Beispiel-Response:
[ {"member_id": 12, "name": "Muster", "vorname": "Max", "email": "max.muster@example.org"}, {"member_id": 13, "name": "Beispiel", "vorname": "Erika", "email": "erika.beispiel@example.org"} ]
Konfiguration
Die Einstellungen für die App und die API werden im Contao Backend unter Diveclub > Einstellungen (tl_dc_config) vorgenommen:
- API aktivieren: Schaltet den Zugriff für die App frei.
- App-Logo: Bilddatei für die Startseite.
- Info-Text App: Begrüßungstext für die Startseite.
- Impressum (App): Rechtliche Angaben für die App.
- Datenschutzhinweise (App): Hinweise zum Datenschutz für die App.
- Nutzungsbedingungen (App): Nutzungsbedingungen/AGB für die App.
- News-Archiv: Auswahl des Archivs, das in der App angezeigt werden soll.
- Instruktor-Gruppen: Grundlage für die Rollenermittlung
instructorin Login- und Profil-Endpunkten. - Training Manager: Dieses Mitglied erhält Zugriff auf
/api/instructor/dashboardsowie auf die Freigabe- und Ablehnungsaktionen für Kursanmeldungen.
Installation
- Das Bundle via Composer hinzufügen:
composer require diversworld/contao-dw-api-bundle
- Contao Installtool ausführen oder Migrationen starten (inkl. neuer Felder):
ddev php vendor/bin/contao-console contao:migrate -n ddev php vendor/bin/contao-console cache:clear --env=prod
- Sicherstellen, dass das
diversworld/contao-diveclub-bundleebenfalls installiert ist, da dieses API-Bundle darauf aufbaut.
Anforderungen
- Contao 5.3 oder höher (optimiert für Contao 5.7)
- PHP 8.2 oder höher
diversworld/contao-diveclub-bundle
Kompatibilität & Modernisierung
Das Bundle wurde für Contao 5.7 und Symfony 7 optimiert:
- Routing: Verwendung von PHP 8 Attributen (
#[Route]) statt Annotationen. Durch die explizite Angabe des TypsattributeimContaoManagerPlugin wird die Kompatibilität mit Contao 5.3+ sichergestellt. - Security: Nutzung des
UserPasswordHasherInterfaceundIsGrantedAttributen. - String Handling: Umstellung auf
StringUtil::restoreBasicEntities()für volle Kompatibilität mit Contao 5+.
diversworld/contao-dw-api-bundle 适用场景与选型建议
diversworld/contao-dw-api-bundle 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 64 次下载、GitHub Stars 达 1, 最近一次更新时间为 2026 年 02 月 09 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「api」 「contao」 「contao-bundle」 「diving」 「diveclub」 「course-management」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 diversworld/contao-dw-api-bundle 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 diversworld/contao-dw-api-bundle 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 diversworld/contao-dw-api-bundle 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Contao Open Source CMS
Diese Contao 4 Erweiterung stellt Google reCAPTCHA V2 in Form eines neuen Formularfeldes im Formulargenerator bereit. This extension provides Google reCAPTCHA V2 in the form of a new form field in the form generator of Contao Open Source CMS.
Backend Optimizing Bundle
Development Settings Bundle
Article CSS-ID Frontend Output Optimization
A PSR-7 compatible library for making CRUD API endpoints
统计信息
- 总下载量: 64
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 1
- 点击次数: 34
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: GPL-3.0-or-later
- 更新时间: 2026-02-09
