# Jede Symfony-Bestellung ihrem Kanal zuordnen

> MIRA FIVE in Symfony einrichten: Ein Bundle bringt das Skript per Twig-Funktion ins Layout und sendet bezahlte Bestellungen erst nach der Antwort an den Browser.

URL: https://mirafive.io/de/fuer/symfony  
Updated: 2026-09-28

Ein Bundle gibt das Script per Twig aus und sendet jede bezahlte Bestellung, wenn die Antwort schon draußen ist.

Paket `mirafive/sdk-symfony`

## In 5 Schritten eingerichtet

1. ### Bundle installieren  
Mit Symfony Flex registriert sich das Bundle selbst, ohne Flex tragen Sie `MiraFive\Symfony\MiraFiveBundle::class => ['all' => true]` in `config/bundles.php` ein. Es setzt PHP 8.3 und Symfony 6.4, 7 oder 8 voraus.  
```  
composer require mirafive/sdk-symfony  
```
2. ### Zwei Schlüssel eintragen  
Der geheime Schlüssel einer Server-Quelle sendet aus Ihrer App, der Website-Schlüssel einer Website-Quelle steht im Script-Tag. Beide finden Sie unter **Daten → Quellen**. Sie gehören in `.env.local` oder Ihren Secret-Store, nie ins Repository. Eine Konfigurationsdatei brauchen Sie nicht.  
```  
MIRAFIVE_SECRET_KEY=mf_…  
MIRAFIVE_WEBSITE_KEY=mf_…  
```
3. ### Script per Twig ausgeben  
`mirafive_script()` gibt das zweizeilige Script-Tag mit Ihrem Website-Schlüssel aus, ohne Schlüssel nichts. Es zählt jede Seite und startet einwilligungsfrei, ohne Cookies und ohne Speicher auf dem Gerät.  
```  
<head>  
    {{ mirafive_script() }}  
</head>  
```
4. ### Bestellung melden  
`MiraFive\Mira` wird per Autowiring injiziert. `track()` puffert nur, das Bundle sendet auf `kernel.terminate`, wenn die Antwort beim Browser ist. `flush()` rufen Sie nie selbst auf.  
```  
use MiraFive\Mira;  
// $mira ist das injizierte MiraFive\Mira, etwa als Argument des Controllers  
$mira->track('order_paid', userId: (string) $order->getCustomerId(), properties: [  
    'revenue' => 328,  
    'currency' => 'EUR',  
]);  
```
5. ### Einrichtung prüfen  
Der Befehl sendet ein Test-Event, das weder gespeichert noch berechnet wird, und endet mit „The secret key and host work. Nothing was stored or billed.“ Danach öffnen Sie eine Seite unter ihrer echten Domain und sehen unter **Daten → Live** nach.  
```  
bin/console mirafive:check  
```

MIRA FIVE ist Analyse rund um die Person. Das Bundle bringt das PHP-SDK in Ihren Container: `MiraFive\Mira` kommt per Autowiring, eine Twig-Funktion gibt das Script aus, und Events gehen auf `kernel.terminate` und `console.terminate` raus. Keine Seite wartet auf die Analyse.

## Wie kommt eine Bestellung zu ihrem Kanal?

Über die Person. Stellen Sie die Website-Quelle unter **Daten → Quellen** auf **Vollständig** und das Script auf den vollen Modus. Ihr Banner übergibt die Antwort mit `mirafive('consent', …)`:

```yaml
# config/packages/mirafive.yaml
mirafive:
    script_mode: full
```

Nach der Anmeldung identifiziert ein Listener auf `LoginSuccessEvent` die Person mit derselben internen ID, die Ihr Server sendet. `getUserIdentifier()` ist oft die E-Mail-Adresse und gehört nie hinein:

```php
$this->mira->identify((string) $user->getId(), ['plan' => $user->getPlan()]);
```

Die Bestellung landet dann bei dieser Person, neben dem Kanal ihres ersten Besuchs. Mit einem Kaufziel auf `order_paid` zeigt Herkunft Käufer und Umsatz je Kanal und Kampagne.

## Wie zählt ein Webhook nur einmal?

Mit `send()` und einem Idempotenzschlüssel. Die Methode sendet sofort, nie über Messenger, und eine Wiederholung wird einmal gespeichert:

```php
$mira->send([
    ['name' => 'order_paid', 'userId' => (string) $order->getCustomerId(), 'properties' => ['revenue' => 328, 'currency' => 'EUR']],
], idempotencyKey: "order-{$order->getId()}");
```

## Was übernimmt das Bundle noch?

- `mirafive_script({autocapture: true})` erfasst Klicks, Formulare und Feldänderungen ohne Code.
- `enabled: false` unter `when@dev` zeichnet nichts auf, lokale Arbeit bleibt aus Ihren Zahlen.
- Fehler beim Senden erreichen Ihren Code nie, sie landen als Warnung im Monolog-Kanal `mirafive`.

Im Tab **Einbauen** der Quelle steht **Von Ihrem Coding-Agent einbauen lassen**: ein Prompt für Claude Code, Cursor oder Codex mit allen Schritten und der Prüfung, bei einer Server-Quelle nie mit dem geheimen Schlüssel. Alle Optionen stehen in der [Dokumentation](https://docs.mirafive.io/sdks/symfony), die Aufgabenteilung auf der [Einrichtungsseite](https://mirafive.io/de/einrichtung).

## Andere Einrichtungen

Dieselben Zahlen, egal wie Ihre Website gebaut ist.

- [Next.js](https://mirafive.io/de/fuer/nextjs)
- [React](https://mirafive.io/de/fuer/react)
- [Astro](https://mirafive.io/de/fuer/astro)
- [Laravel](https://mirafive.io/de/fuer/laravel)
- [Nuxt](https://mirafive.io/de/fuer/nuxt)
- [PHP](https://mirafive.io/de/fuer/php)
- [Vue](https://mirafive.io/de/fuer/vue)
- [TanStack Start](https://mirafive.io/de/fuer/tanstack-start)
- [Node.js](https://mirafive.io/de/fuer/nodejs)
- [Convex](https://mirafive.io/de/fuer/convex)
- [JavaScript](https://mirafive.io/de/fuer/javascript)
- [jede Website](https://mirafive.io/de/fuer/website)

[Zur Dokumentation](https://docs.mirafive.io)

## Fragen und Antworten

### Werden Antworten dadurch langsamer?

Nein. `track()` puffert nur, gesendet wird einmal pro Anfrage auf `kernel.terminate`, unter PHP-FPM nach der Antwort. Mit `messenger: true` und einem Routing-Eintrag sendet ein Messenger-Worker.

### Wie testen Sie Code, der Events sendet?

Setzen Sie `test: true` unter `when@test` in `config/packages/mirafive.yaml`. Dann geht nichts ins Netz, und `self::mira()->assertTracked('order_paid')` aus dem Trait `InteractsWithMira` prüft das Event, auch wenn es noch im Puffer liegt.

### Funktioniert das mit FrankenPHP im Worker-Modus oder RoadRunner?

Ja. Jeder Service-Reset zwischen zwei Anfragen sendet den Rest des Puffers, `messenger:consume` sendet nach jeder Nachricht. Der Zustand einer Anfrage hängt an der Anfrage und gerät nie in die nächste.

## Sehen Sie, welcher Kanal Käufer bringt

Kostenlos bis 25.000 Events im Monat. Ohne Kreditkarte.

[Kostenlos starten](https://app.mirafive.io/register)[Zu den Preisen](https://mirafive.io/de/preise)
