13 KiB
01 – Legacy-Analyse
Detailliertes Inventar des Symfony-1.4-Backends in /_businessportal24.com/. Das presseecho-Projekt ist code-identisch.
1. Projektstruktur (Top-Level)
_businessportal24.com/
├── apps/
│ ├── backend/ ← Admin-App (Routing, Config, Templates). Modules liegen in Plugins.
│ └── frontend/ ← Public/Frontend-App (wird NICHT migriert – neue Frontends existieren)
├── config/ ← Globale Config (Datenbanken, Projekt, i18n)
├── lib/ ← Global genutzte Klassen (Models liegen aber in Plugin)
├── plugins/ ← Fachliche Logik – der Hauptteil!
│ ├── PressePortalPlugin ★ Kern-Plugin (Entities, Modules, Forms)
│ ├── sfDoctrineGuardPlugin ← Auth
│ ├── sfDoctrineGuardPaymentPlugin ★ Payment, Invoice, Coupon
│ ├── sfDoctrineApplyPlugin ← Registrierung
│ ├── sfFormExtraPlugin ← Form-Widgets
│ ├── sfImageTransformPlugin ← Image-Thumbnailing
│ ├── sfImageTransformExtraPlugin
│ ├── sfCaptchaGDPlugin ← Captcha
│ ├── sfCsvPlugin ← CSV-Export
│ ├── isicsWidgetFormTinyMCEPlugin← WYSIWYG
│ ├── tnHttpErrorPlugin ← HTTP-Error-Handling
│ └── tnStrategicTesterResponsePlugin
├── symfony-1.4/ ← Framework (Vendor)
├── data/ ← Fixtures
├── web/ ← DocRoot, Public Assets
└── cron_script_{local,server}.sh
2. Admin-Module (PressePortalPlugin/modules/)
2.1 Verwaltung / CRUD
| Modul | Entität | Admin-URL | Migrations-Target |
|---|---|---|---|
adminCenter |
Dashboard / Navigationshub | / |
Livewire admin.dashboard (existiert) |
adminSfGuardAuth |
Login/Logout | /login, /logout |
Fortify (existiert) |
adminSfGuardUser (über Routing) |
User | /sf_guard_user |
admin.users.* (existiert) |
adminSfGuardGroup |
Rollen | /sf_guard_group |
Spatie Roles → admin.roles.* (existiert) |
adminSfGuardPermission |
Permissions | /sf_guard_permission |
Spatie Permissions |
adminSalutation |
Anreden | /salutation |
→ Config (config/salutations.php) |
adminCountry |
Länder | /country |
→ Config (config/countries.php) |
adminCategory |
Kategorien (i18n) | /category |
admin.categories.* (existiert) |
adminCompany |
Firmen/Agenturen | /company |
admin.companies.* (existiert) |
adminContact |
Ansprechpartner | /contact |
admin.contacts.* (existiert) |
adminPressrelease |
Pressemitteilungen | /pressrelease |
admin.press-releases.* (existiert) |
adminPressreleaseimage |
Bilder zu PMs | /pressreleaseimage |
Teil von PressRelease |
adminPromotionlink |
Werbeplätze/Links | /promotionlink |
Scope-Entscheidung nötig |
adminFootercode |
Custom Footer-HTML | /footercode |
Scope-Entscheidung nötig |
adminBlacklist |
Wort-Blacklist | /blacklist |
admin.blacklist.* (neu) |
adminNewslettersubscription |
Newsletter-Subscriber | /newslettersubscription |
admin.newsletter.subscribers (existiert) |
sfpCouponAdmin |
Gutscheine | /coupon |
admin.coupons.* (existiert) |
sfpInvoiceAdmin |
Rechnungen | /invoice |
admin.invoices.* (existiert) |
sfpInvoiceBillingAddressAdmin |
Rechn.-Adressen | /invoice_billing_address |
Teil von Invoice |
sfpUserBillingAddressAdmin |
User-Rechn.-Adressen | /user_billing_address |
Teil von User |
sfpUserPaymentOptionAdmin |
User-Abos/Payment | /user_payment_option |
admin.payments.* (existiert) |
2.2 Service-/System-Module
| Modul | Zweck | Migrations-Target |
|---|---|---|
sfpCron |
HTTP-Trigger für Cron-Scripts | Laravel Scheduler (routes/console.php) |
sfpStore |
Abo-/Bestell-Flow | Stripe Checkout + Domain-Service |
sfpInvoicePdf |
PDF-Generation | barryvdh/laravel-dompdf + Blade-Template |
sfpUserBilling |
User-seitige Rechn.-Übersicht | Frontend-/Kundencenter-Views |
import |
CSV-/Daten-Import | Neu als php artisan Command(s) |
ajax |
Autocompletion für Admin-Forms | Livewire wire:model-Suche |
tnHttpError |
Error-Views | Laravel's Standard-Error-Pages |
2.3 Frontend-Module (werden NICHT migriert)
| Modul | Zweck |
|---|---|
company, customercenter, page, pressrelease, pressreleaseimage, category, profile, newsletter, presscontact, sfApply, sfGuardAuth, sfGuardUser |
Altes Symfony-Frontend. Wird ersetzt durch bestehendes resources/views/web/* und das neue Backend-API |
3. Datenmodell (aus PressePortalPlugin/config/doctrine/schema.yml)
3.1 Entitäten (Kern)
| Doctrine-Entität | Zeilen in Schema | Fachlicher Zweck |
|---|---|---|
Salutation |
4–18 | Anrede (Herr/Frau, i18n) |
Country |
23–32 | Länder |
sfGuardUser |
38–84 | User |
sfGuardUserProfile |
92–191 | User-Profil (Name, Adresse, Tel, E-Mail, API-Key, Tax-ID …) |
Company |
197–278 | Firma (inkl. Logo, Login, Footer-Code-Disable) |
Agency |
280–297 | Column-Aggregation-Inheritance von Company (ctype='agency') |
CompanyUser |
300–318 | User ↔ Company Pivot |
ApiUser |
321–339 | API-Only User-Markierung |
ResponsibleCompanyUser |
342–360 | Verantwortliche User pro Company |
Contact |
365–411 | Ansprechpartner einer Firma |
NewsletterSubscription |
418–469 | Newsletter-Anmeldungen |
Category |
476–494 | Kategorien (i18n, sluggable) |
PressRelease |
500–575 | Pressemitteilungen (mit Teaser-Range, Status, SEO) |
PressReleaseContact |
583–601 | PM ↔ Contact Pivot |
PressReleaseImage |
608–644 | Bilder zu PMs |
PromotionLink |
650–684 | Werbelinks |
PromotionLinkCategory |
687–705 | PromotionLink ↔ Category Pivot |
FooterCode |
707–733 | Custom Footer-HTML pro Kategorie/Sprache |
CategoryFooterCode |
735–753 | Pivot |
Blacklist |
755–768 | Worte für Spam-Check |
UserBillingAddress |
771–807 | Rechn.-Adresse am User |
InvoiceBillingAddress |
809–841 | Rechn.-Adresse auf Rechnung (Snapshot) |
UserPaymentOptionCompany |
854–874 | Abo ↔ Firma |
3.2 Entitäten aus sfDoctrineGuardPaymentPlugin
| Entität | Zweck |
|---|---|
PaymentOption |
Produkt-Definition (Preis, Typ: recurring/onetime/single) |
PaymentOptionReference |
Self-referencing, Parent→Child (z. B. Aufpreispakete) |
PaymentOptionExcludeGroup |
Gruppen, die Option NICHT buchen dürfen |
PaymentOptionAccessGroup |
Gruppen, die durch Option Zugriff erhalten |
UserPaymentOption |
Gebuchtes Abo (User ↔ Produkt), Status, Laufzeit |
UserPaymentOptionReference |
Self-referencing |
UserPayment |
Zahlungsdatensatz |
Invoice |
Rechnung (mit Mahnungen, Fälligkeit) |
UserBillingAddress |
(hier nochmal definiert) |
InvoiceBillingAddress |
(hier nochmal definiert) |
Coupon |
Gutschein |
3.3 sfGuard-Tabellen
sfGuardUser, sfGuardGroup, sfGuardPermission, sfGuardUserGroup, sfGuardGroupPermission, sfGuardUserPermission, sfGuardRememberKey → Mapping auf Laravel users + Spatie roles/permissions/model_has_*.
3.4 Besondere Doctrine-Features
| Feature | Verwendung | Laravel-Äquivalent |
|---|---|---|
actAs: Timestampable |
auf fast allen Entitäten | created_at/updated_at (Standard) |
actAs: I18n |
Salutation, Category, PaymentOption |
Translation-Tabellen oder spatie/laravel-translatable |
actAs: Sluggable |
Company, Category, PressRelease, PressReleaseImage |
spatie/laravel-sluggable |
inheritance: column_aggregation |
Agency extends Company |
Entweder gemeinsames Model mit type-Scope, oder Parent+Child-Model mit globalem Scope |
relations refClass |
viele M:N | Pivot-Tabellen, belongsToMany |
4. Routing (apps/backend/config/routing.yml)
Auszug – 15 sfDoctrineRouteCollection (auto-generated REST für alle CRUD-Entitäten) + folgende Custom-Routes:
| Route | URL | Ziel |
|---|---|---|
homepage |
/ |
adminCenter::index |
change |
/mychange |
adminCenter::change |
sf_guard_signin |
/login |
Login |
sf_guard_signout |
/logout |
Logout |
sf_guard_password |
/request_password |
Password-Reset |
usercp |
/usercp |
User-CP |
masterdata |
/masterdata |
Stammdaten |
portalcp |
/portalcp |
Portal-CP |
promotioncp |
/promotioncp |
Promotion |
pressrelease_company_autocomplete |
/pressrelease/companyautocomplete |
AJAX |
company_user_autocomplete |
/company/userautocomplete |
AJAX |
press_release_autocomplete_url |
/ajax/press_release_autocomplete |
AJAX |
sf_image |
/thumbnails/sf_image/:format/:filepath.:sf_format |
Thumbnails |
slug_image |
/thumbnails/:type/:format/:path/:slug-:id.:sf_format |
Thumbnails (Slug) |
→ Abbildung auf routes/admin.php (bereits zu 80 % vorhanden) + ein paar Livewire-Aktionen.
5. Admin-Menü (config/adminMenu/hnav.yml)
Home
├─ Master data
│ ├─ Countries
│ ├─ Salutations
│ └─ Blacklists
├─ User CP
│ ├─ Users
│ ├─ Groups
│ ├─ Permissions
│ └─ Newsletter subscription
├─ Billing
│ ├─ Payment options
│ ├─ Coupons
│ └─ Invoices
├─ Portal CP
│ ├─ Press releases
│ ├─ Press release images
│ ├─ Categories
│ ├─ Companies
│ └─ Contacts
└─ Promotions
├─ Promotion links
└─ Footer code
→ Diese Struktur ist im neuen Laravel-Projekt bereits in der sidebar.blade.php-Navigation abgebildet.
6. Cron-Scripts (cron_script_server.sh)
php symfony sfp:user-payment-create --application=frontend
php symfony sfp:invoice-create --application=frontend --culture=de
php symfony sfp:invoice-reminder --application=frontend --culture=de
# php symfony sfp:user-paymentoption-expire --application=frontend (deaktiviert)
Dazu sfpCron::index (HTTP-getriggert, sehr unsicher: Shared-Secret als URL-Parameter).
Ziel-Mapping:
| Legacy-Task | Neu |
|---|---|
sfp:user-payment-create |
Job CreateRecurringPayments (daily) |
sfp:invoice-create |
Job GenerateInvoices (daily) |
sfp:invoice-reminder |
Job SendInvoiceReminders (daily) |
sfp:user-paymentoption-expire |
Job ExpirePaymentOptions (daily) |
Alles über Laravel Scheduler → routes/console.php.
7. API (aus lib/ApiActions.class.php + Frontend-Modulen)
- Auth: Statischer
api_keyim User-Profil (String, SHA1-base64). - CSRF: Für API-Requests in
prepareForm()deaktiviert. - Endpoints (exakte Liste siehe
07-API-MIGRATION.md):POST /pressrelease/create– neue PM anlegenPOST /pressreleaseimage/upload– Bild hochladenGET /pressrelease/list– PMs des UsersGET /company/listPOST /newsletter/subscribe- …
8. Mailer (lib/bpMailer.class.php)
- Templating via
get_partial()in Symfony. - Versand via SwiftMailer.
→ Ersetzt durch:
- Laravel
Mailable+ Blade-Templates - Queues (
mailqueue)
9. Frontend-Assets / Thumbnails
- URL-Format:
/thumbnails/pressreleaseimage/thumb_200/pr/<slug>-<id>.jpg - Generator:
sfImageTransformPlugin - Pfade referenzieren Slugs → bei Slug-Änderung Broken-Links
→ Ersatz: intervention/image + /storage/images/... + public/thumbnails/.... Für alte URLs 302-Redirect-Middleware.
10. Vorarbeiten im Repository (nicht verlieren!)
_businessportal24.com/dev/– Bereits extrahiertes Core-Package mit DTOs, Enums, Value Objects, Domain-Events. Inhalte prüfen + dort wo sinnvoll in Laravel-App übernehmen._businessportal24.com/dev/migration/– Vorhandene Migrations-Doku (CHECKLIST, IMPLEMENTATION etc.) – als Referenz nutzen, aber nicht mehr pflegen.dev/_old/Models/&dev/_old/migrations/– Früher automatisch erzeugte Eloquent-Modelle/-Migrations aus dem alten Schema (2024). Wert: Nützliches Mapping der Spalten-/Typ-Namen. NICHT 1:1 übernehmen – Schema wird modernisiert.
11. „Kritische" Stellen (Achtung bei Migration)
| Datei / Ort | Problem |
|---|---|
PressePortalPlugin/lib/helper/PaypalCredentialsHelper.php (oder vergleichbar) |
Hart-kodierte PayPal-Credentials → entfällt (nur Stripe) |
sfpCron/actions/actions.class.php |
Shared Secret G8ZvEbnP8fEPfnWX4L in URL; exec()-Call → entfällt |
sfGuardUser.password-Feld |
sha1($salt.$password) → Laravel bcrypt, Legacy-Hasher nötig |
Company.ctype enum |
Inheritance-Feld; bei Migration entscheiden, ob type enum('agency','company') oder Single-Table |
sfGuardUserProfile.api_key |
Wird von API-Clients genutzt → Umwandlung nach Sanctum + Keep-Alive |
PressRelease.text |
string(40000) – in MySQL 8 auf TEXT oder MEDIUMTEXT mappen |
Thumbnails mit /slug-id.ext |
Bei Slug-Änderung 404; neues Schema sollte id primär nutzen, Slug redirectbar |
Mehrsprachigkeit I18n behavior |
Aktuell de + en Daten in *_translation-Tabellen – siehe 04-DATA-MODEL.md |