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

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

api/src/State/OwnProjectsCollectionProvider.php
<?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.