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
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.