Eigene Publikationen bei Custom-Operations
Eigene Publikationen bei Custom-Operations
~14 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
mercure: true (Kapitel 68) publiziert AUTOMATISCH bei den STANDARD-Operationen – die Custom-Operation aus Kapitel 61 (/projects/{id}/archive) braucht eine EXPLIZITE Publikation.
Warum Custom-Operations nicht automatisch publizieren
API Platforms AUTOMATISCHE Mercure-Publikation ist an die STANDARD-Doctrine-Persistenz gekoppelt – ArchiveProjectProcessor (Kapitel 61) ruft ZWAR flush() auf, aber NICHT über den STANDARD-Mechanismus, der die Publikation AUTOMATISCH auslöst.
Den HubInterface-Publisher injizieren
<?php
declare(strict_types=1);
namespace App\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProcessorInterface;
use App\Entity\Project;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Mercure\HubInterface;
use Symfony\Component\Mercure\Update;
use Symfony\Component\Serializer\SerializerInterface;
final class ArchiveProjectProcessor implements ProcessorInterface
{
public function __construct(
private readonly EntityManagerInterface $entityManager,
private readonly HubInterface $hub,
private readonly SerializerInterface $serializer,
) {
}
public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): Project
{
/** @var Project $data */
$data->setArchived(true);
$this->entityManager->flush();
$topic = 'https://localhost/api/projects/' . $data->getId();
$json = $this->serializer->serialize($data, 'jsonld', ['groups' => ['project:read']]);
$this->hub->publish(new Update($topic, $json));
return $data;
}
}HubInterface ist GENAU der Service, den API Platform INTERN SELBST für die AUTOMATISCHE Publikation aus Kapitel 68 nutzt – JETZT EXPLIZIT verwendet, mit EIGENER Kontrolle über Topic und Inhalt.
Dieselbe Serialisierungsgruppe verwenden
['groups' => ['project:read']] STELLT SICHER, dass die PUBLIZIERTE Nachricht GENAU dasselbe Format hat wie eine normale GET-Antwort (Kapitel 23) – ein Client kann DIESELBE Deserialisierungslogik für BEIDE Quellen nutzen.
Das Verhalten testen
EIN Abonnement auf /api/projects/1 (Kapitel 69) EINRICHTEN, dann POST /api/projects/1/archive aufrufen – das Update mit "archived": true erscheint SOFORT im Abonnement, GENAU wie bei einem STANDARD-PATCH.
Achtung: Diese MANUELLE Publikation FUNKTIONIERT auch dann, wenn mercure: true auf Resource-Ebene GAR NICHT gesetzt wäre – der HubInterface-Service ist UNABHÄNGIG von der #[ApiResource]-Metadatenkonfiguration nutzbar.
Tipp: DIESES Muster (State Processor, der ZUSÄTZLICH zur eigentlichen Aktion EIN Update publiziert) lässt sich auf JEDE Custom-Operation übertragen – ÜBERALL, wo eine Aktion den ÖFFENTLICH sichtbaren Zustand einer Resource ändert, ist eine EXPLIZITE Publikation sinnvoll.