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

Das owner-Feld automatisch setzen

Das owner-Feld automatisch setzen

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

Der Voter aus Kapitel 52 braucht $project->getOwner() – dieses Kapitel ergänzt das Feld UND sorgt dafür, dass es AUTOMATISCH beim Erstellen gesetzt wird, NIEMALS vom Client selbst.

Das owner-Feld ergänzen

api/src/Entity/Project.php
use App\Entity\User;

// ... innerhalb der Klasse:

#[ORM\ManyToOne]
#[ORM\JoinColumn(nullable: false)]
#[Groups(['project:read'])]
private ?User $owner = null;

public function getOwner(): ?User
{
    return $this->owner;
}

public function setOwner(User $owner): static
{
    $this->owner = $owner;

    return $this;
}

Achtung: BEWUSST OHNE project:write in den Groups – wäre owner SCHREIBBAR, könnte JEDER Nutzer beim Erstellen behaupten, ein ANDERER Nutzer sei der Owner. Das Feld wird STATTDESSEN über einen State Processor gesetzt.

Einen Owner-Processor schreiben

api/src/State/ProjectOwnerProcessor.php
<?php

declare(strict_types=1);

namespace App\State;

use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProcessorInterface;
use App\Entity\Project;
use App\Entity\User;
use Symfony\Bundle\SecurityBundle\Security;

final class ProjectOwnerProcessor implements ProcessorInterface
{
    public function __construct(
        private readonly ProcessorInterface $persistProcessor,
        private readonly Security $security,
    ) {
    }

    public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): mixed
    {
        if ($data instanceof Project && null === $data->getOwner()) {
            $user = $this->security->getUser();

            if ($user instanceof User) {
                $data->setOwner($user);
            }
        }

        return $this->persistProcessor->process($data, $operation, $uriVariables, $context);
    }
}

GENAU dasselbe Wrapping-Muster wie UserPasswordHasherProcessor aus Kapitel 48 – Symfony\Bundle\SecurityBundle\Security liefert den AKTUELL eingeloggten Nutzer, GENAU wie $this->getUser() in einem klassischen Symfony-Controller.

use App\State\ProjectOwnerProcessor;

#[ApiResource(
    processor: ProjectOwnerProcessor::class,
    // ...
)]

Das vollständige Verhalten testen

curl -k -X POST https://localhost/api/projects \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"name": "Mein neues Projekt"}'

Das erstellte Project hat owner AUTOMATISCH auf den EINGELOGGTEN Nutzer gesetzt – EIN PATCH AUF DIESES Project vom GLEICHEN Nutzer funktioniert JETZT (Kapitel 53), von einem ANDEREN Nutzer OHNE ROLE_ADMIN weiterhin NICHT.

Tipp: Migration NICHT vergessen: owner_id als NEUE, NICHT-NULLABLE Spalte erfordert bei BEREITS vorhandenen Testdaten entweder einen Default-Wert in der Migration ODER ein VORHERIGES doctrine:database:drop --force && doctrine:database:create, um mit einer LEEREN Datenbank neu zu starten.