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