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

Einen eigenen Voter schreiben

Einen eigenen Voter schreiben

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

Inline-security-Ausdrücke (Kapitel 51) werden bei KOMPLEXER Logik schnell UNÜBERSICHTLICH – ein Voter kapselt die Entscheidung "darf dieser Nutzer DIESES Project bearbeiten?" in einer EIGENEN, TESTBAREN Klasse.

Die ProjectVoter-Klasse anlegen

docker compose exec php bin/console make:voter ProjectVoter
api/src/Security/Voter/ProjectVoter.php
<?php

declare(strict_types=1);

namespace App\Security\Voter;

use App\Entity\Project;
use App\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;

final class ProjectVoter extends Voter
{
    public const EDIT = 'PROJECT_EDIT';
    public const VIEW = 'PROJECT_VIEW';

    protected function supports(string $attribute, mixed $subject): bool
    {
        return \in_array($attribute, [self::EDIT, self::VIEW], true)
            && $subject instanceof Project;
    }

    protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token): bool
    {
        $user = $token->getUser();

        if (!$user instanceof User) {
            return false;
        }

        /** @var Project $project */
        $project = $subject;

        if (\in_array('ROLE_ADMIN', $user->getRoles(), true)) {
            return true;
        }

        return match ($attribute) {
            self::VIEW => true,
            self::EDIT => $project->getOwner() === $user,
            default => false,
        };
    }
}

GENAU dasselbe Voter-Grundgerüst wie in der Symfony-Schulung (Kapitel 40) – supports() entscheidet, OB der Voter überhaupt ZUSTÄNDIG ist, voteOnAttribute() trifft die eigentliche JA/NEIN-Entscheidung.

Achtung: Der Voter referenziert $project->getOwner() – DIESES Feld existiert NOCH NICHT. Kapitel 54 ergänzt es. Bis dahin schlägt EDIT für ALLE Nutzer außer ROLE_ADMIN fehl, was für die ZWISCHENZEITLICHE Entwicklung UNPROBLEMATISCH ist.

Registrierung: automatisch

GENAU wie in der Symfony-Schulung erkennt Symfonys Autowiring den Voter AUTOMATISCH über das Voter-Interface – KEINE manuelle Eintragung in services.yaml nötig.

Tipp: PROJECT_VIEW/PROJECT_EDIT als STRING-Konstanten (statt roher Strings) verhindern Tippfehler beim späteren Aufruf in Kapitel 53 – ein Tippfehler in einem rohen String würde STILLSCHWEIGEND IMMER "nicht erlaubt" liefern, statt einen Fehler zu werfen.