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