Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

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

api/src/State/ArchiveProjectProcessor.php
<?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.