Skip to main content

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:

  1. \r\n / \r\n normalisieren
  2. [[if|ifnot|endif]]-Blöcke → Blade-@if/@endif
  3. ..varName..-Placeholder → {{ $varName ?? "" }}
  4. nl2br() damit Zeilenumbrüche im HTML erhalten bleiben
  5. Blade::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

WeclappBladeBeschreibung
..varName..{{ $varName ?? "" }}Variable, fällt auf "" zurück
..snake_case..{{ $snakeCase ?? "" }} (camelCase!)Snake-Case wird zu camelCase umgewandelt
[[if foo]] … [[endif]]@if(!empty($foo)) … @endifnur wenn Truthy
[[ifnot foo]] … [[endif]]@if(empty($foo)) … @endifnur 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 (siehe api_old/grenke/intro.mdx — TODO-Liste).