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

Den Voter an Operations binden

Den Voter an Operations binden

~12 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026

Der ProjectVoter aus Kapitel 52 existiert, wird aber NOCH NIRGENDS AUFGERUFEN – is_granted() im security-Ausdruck verbindet BEIDE.

Den Voter in security verwenden

api/src/Entity/Project.php
use App\Security\Voter\ProjectVoter;

#[ApiResource(
    operations: [
        new GetCollection(),
        new Get(security: "is_granted('" . ProjectVoter::VIEW . "', object)"),
        new Post(security: "is_granted('IS_AUTHENTICATED_FULLY')"),
        new Put(security: "is_granted('" . ProjectVoter::EDIT . "', object)"),
        new Patch(security: "is_granted('" . ProjectVoter::EDIT . "', object)"),
        new Delete(security: "is_granted('" . ProjectVoter::EDIT . "', object)"),
    ],
    // ...
)]

object ist eine SPEZIELLE Variable, die API Platform IM security-Ausdruck AUTOMATISCH mit der betroffenen Project-Instanz füllt – GENAU das $subject aus voteOnAttribute().

Achtung: GetCollection hat BEWUSST KEINEN security-Parameter mit object – bei einer Sammlung gibt es KEIN einzelnes Objekt zum Prüfen. Die FILTERUNG, welche Elemente ein Nutzer in der Liste sieht, ist ein SEPARATES Thema (Kapitel 55).

Das Verhalten testen

curl -k -i -X PATCH https://localhost/api/projects/1 \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/merge-patch+json' \
  -d '{"name": "Neuer Name"}'

403 Forbidden, solange getOwner() (Kapitel 54) noch NICHT existiert und der eingeloggte Nutzer KEIN ROLE_ADMIN hat – GENAU das ERWARTETE Verhalten laut Voter-Logik aus Kapitel 52.

Die eigene Fehlermeldung prüfen

new Patch(
    security: "is_granted('" . ProjectVoter::EDIT . "', object)",
    securityMessage: 'Nur der Ersteller oder ein Administrator darf dieses Projekt bearbeiten.',
),

Tipp: Die String-Verkettung "is_granted('" . ProjectVoter::EDIT . "', object)" wirkt UNGEWOHNT, ist aber NOTWENDIG: PHP-Attribute akzeptieren NUR Konstanten-Ausdrücke zur COMPILE-Zeit, KEINE String-Interpolation mit geschweiften Klammern wie in normalem PHP-Code.