WeclappTemplateRendererService
App\Services\WeclappTemplateRendererService
Konvertiert die Weclapp-Mail-Template-Syntax in Laravel Blade und rendert sie. Ein Mini-Template-Compiler — leichtgewichtig, kein Dependency.
API
render(string $template, array $variables = []): string
$html = $this->weclappTemplateRendererService->render(
$template->body,
[
'companyName' => 'Acme GmbH',
'orderDate' => '12.04.2026',
'technicianAppointment' => true,
'technicianAppointmentDate' => '15.04.2026',
'technicianAppointmentTime' => '10:00',
]
);
Pipeline:
\r\n/\r→\nnormalisieren[[if|ifnot|endif]]-Blöcke → Blade-@if/@endif..varName..-Placeholder →{{ $varName ?? "" }}nl2br()damit Zeilenumbrüche im HTML erhalten bleibenBlade::render()— mit normalem Blade-Compiler
convertWeclappTemplateToBlade(string $template): string
Gibt den konvertierten Blade-String zurück, ohne ihn zu rendern. Nützlich für Debugging.
Syntax-Mapping
| Weclapp | Blade | Beschreibung |
|---|---|---|
..varName.. | {{ $varName ?? "" }} | Variable, fällt auf "" zurück |
..snake_case.. | {{ $snakeCase ?? "" }} (camelCase!) | Snake-Case wird zu camelCase umgewandelt |
[[if foo]] … [[endif]] | @if(!empty($foo)) … @endif | nur wenn Truthy |
[[ifnot foo]] … [[endif]] | @if(empty($foo)) … @endif | nur wenn Falsy / leer |
Zeilenumbruch \n | <br /> | via nl2br($html, false) |
Wichtig: der Renderer wandelt alle Variablen-Namen in camelCase um. Im Weclapp-Template darfst du
..order_date..schreiben — gerendert wird gegen$orderDate.
Beispiel
Weclapp-Template (raw):
Sehr geehrte ..formal_salutation..,
[[if technician_appointment]]
Wir bestätigen den Termin am ..technician_appointment_date.. um ..technician_appointment_time..
[[endif]]
[[ifnot technician_appointment]]
Bitte teilen Sie uns einen passenden Termin mit.
[[endif]]
Variablen:
[
'formalSalutation' => 'Frau Dr. Paulsen',
'technicianAppointment' => true,
'technicianAppointmentDate'=> '15.04.2026',
'technicianAppointmentTime'=> '10:00',
]
Render-Output (HTML):
Sehr geehrte Frau Dr. Paulsen,<br />
<br />
Wir bestätigen den Termin am 15.04.2026 um 10:00<br />
Erweitern
Weitere Direktiven hinzuzufügen ist trivial: in convertConditionalBlocks() einen weiteren preg_replace_callback ergänzen. Z. B. für [[loop items]] … [[endloop]] → @foreach($items as $item) … @endforeach.
Dann allerdings auch in der Variablen-Resolution beachten, dass innerhalb des Loops $item verfügbar ist.
Aktueller Roadmap-Punkt aus dem Wiki:
loops,if/else, Datumsformat-Filter, "echte" Blade-Direktiven (sieheapi_old/grenke/intro.mdx— TODO-Liste).