Collections nach Nutzer filtern
Collections nach Nutzer filtern
~14 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Kapitel 53 sicherte EINZELNE Projekte ab – GET /api/projects zeigt aber WEITERHIN ALLE Projekte ALLER Nutzer. Ein State Provider FILTERT die Collection SELBST.
Das Problem demonstrieren
curl -k https://localhost/api/projects -H "Authorization: Bearer $TOKEN"Liefert ALLE 45 Testprojekte, UNABHÄNGIG davon, WEM sie gehören – der Voter aus Kapitel 52-53 wirkt NUR auf EINZELNE Item-Operationen, NICHT auf die Collection-Abfrage SELBST.
Einen eigenen Collection-Provider schreiben
<?php
declare(strict_types=1);
namespace App\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
use App\Entity\User;
use App\Repository\ProjectRepository;
use Symfony\Bundle\SecurityBundle\Security;
final class OwnProjectsCollectionProvider implements ProviderInterface
{
public function __construct(
private readonly ProjectRepository $projectRepository,
private readonly Security $security,
) {
}
public function provide(Operation $operation, array $uriVariables = [], array $context = []): iterable
{
$user = $this->security->getUser();
if (!$user instanceof User) {
return [];
}
if (\in_array('ROLE_ADMIN', $user->getRoles(), true)) {
return $this->projectRepository->findAll();
}
return $this->projectRepository->findBy(['owner' => $user]);
}
}Der State Provider ERSETZT die STANDARD-Doctrine-Abfrage KOMPLETT – ANDERS als der Processor aus Kapitel 48/54 (der den STANDARD-Ablauf UMHÜLLT), muss ein GEZIELT ERSETZENDER Provider die Datenbankabfrage SELBST übernehmen.
use App\State\OwnProjectsCollectionProvider;
new GetCollection(provider: OwnProjectsCollectionProvider::class),Achtung: DIESER einfache Provider verliert die Pagination/Filter/Sortierung aus Block 4 – in einem REALEN Projekt müsste er die Query-Parameter SELBST auswerten oder (BESSER) einen QueryBuilder statt findBy() nutzen und ihn an den STANDARD-Provider WEITERREICHEN. Für DIESES Lernbeispiel bleibt die Vereinfachung BEWUSST bestehen, Block 7 vertieft State Provider im Detail.
Das Verhalten testen
ZWEI verschiedene Nutzer anlegen (Kapitel 49), JEWEILS ein Project erstellen (Kapitel 54 setzt owner automatisch), dann GET /api/projects mit BEIDEN Tokens vergleichen – JEDER Nutzer sieht NUR SEINE EIGENEN Projekte.
Tipp: ROLE_ADMIN sieht WEITERHIN ALLE Projekte – GENAU dasselbe Muster wie im Voter aus Kapitel 52, KONSISTENT auf Collection- UND Item-Ebene angewendet.