Почему мои пост -эксплуатации в Subresource обновляют ту же запись вместо создания новых?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Почему мои пост -эксплуатации в Subresource обновляют ту же запись вместо создания новых?

Сообщение Anonymous »

Я не могу получить Subresource post операции, работающие, как и ожидалось, на платформе API 4.1 с subresources ; Ресурсы высшего уровня работают нормально.
Ожидается: Новые подразмерки могут быть созданы по мере необходимости. Фактическое: может быть создан только один подгрупп; Дополнительные попытки просто перезаписать исходный subresource.
минимальный пример
У меня есть объекты пользователь и usermail в отношениях One-many:
user.php: mrany-many = "lang-phprint">

Код: Выделить всё

#[Groups(['user:read'])]
#[ORM\OneToMany(targetEntity: UserEmail::class, mappedBy: 'user', cascade: ['persist', 'remove'])]
private Collection $emails;
< /code>
useremail.php: написан#[ApiResource(
uriTemplate: '/users/{userUuid}/emails',
uriVariables: [
'userUuid' => new Link(fromClass: User::class, fromProperty: 'emails'),
],
operations: [
new Post(
normalizationContext: ['groups' => ['userEmail:read']],
security: "is_granted('ROLE_ADMIN') or (is_granted('ROLE_USER') and user.getUuid() == request.attributes.get('userUuid'))",
processor: UserEmailProcessor::class,
),
]
)]

#[ORM\Entity(repositoryClass: UserEmailRepository::class)]
#[ORM\Table(name: 'user_email')]
#[UniqueEntity(fields: ['email'], message: 'This email is already in use.')]
final class UserEmail
{
#[ApiProperty(identifier: false)]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'SEQUENCE')]
#[ORM\Column(type: 'integer')]
private int $id;

#[ApiProperty(identifier: true)]
#[Assert\Uuid(versions: [4], groups: ['userEmail:read', 'userEmail:write'])]
#[Groups(['userEmail:read', 'user:read'])]
#[ORM\Column(type: 'string', length: 36, unique: true)]
private string $uuid;

#[ApiProperty]
#[Assert\NotBlank]
#[Assert\Regex(pattern: '/^\d+$/')]
#[Groups(['userEmail:read', 'userEmail:write', 'user:read'])]
#[ORM\Column(type: 'string', length: 20, unique: true)]
private string $email;

#[ApiProperty]
#[Groups(['userEmail:read'])]
#[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'emails')]
#[ORM\JoinColumn(nullable: false)]
private User $user;

public function __construct(?UuidInterface $uuid = null)
{
$this->uuid = $uuid?->toString() ?? Uuid::uuid4()->toString();
}

// ...
}
< /code>
 проблема < /h1>
запрос: < /p>
POST /users/00000000-0000-0000-0000-000000000001/emails
{
"email": "aaa@test.com"
}
< /code>
{
"title": "An error occurred",
"detail": "An exception occurred while executing a query: SQLSTATE[23502]: Not null violation: 7 ERROR:  null value in column \"user_id\" of relation \"user_email\" violates not-null constraint\nDETAIL:  Failing row contains (1, 6b63235a-8c25-468c-881f-b4ce80618c56, 2222222, null).",
"status": 500,
"type": "/errors/500"
}
< /code>
UserEmail::$user
не устанавливается из URI, как и ожидалось. Тем не менее, я могу использовать государственный процессор для установки поля пользователя :: $ user вручную. Я должен прикрепить этот процессор состояния к операции Post .

Код: Выделить всё

#[ApiResource(
operations: new Post(
processor: UserEmailProcessor::class,
// ...
)
// ...
)]
< /code>
UserEmailProcessor.php:
final readonly class UserEmailProcessor implements ProcessorInterface
{
public function __construct(
private EntityManagerInterface $entityManager,
private UserRepository $userRepository,
private RequestStack $requestStack,
) {
}

public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): mixed
{
if (!$data instanceof UserEmail) {
return $data;
}

$userUuid = $uriVariables['userUuid'] ?? null;

$user = $this->userRepository->findOneBy(['uuid' => $userUuid]);
if (!$user) {
throw new NotFoundHttpException();
}

$data->setUser($user);

$this->entityManager->persist($data);
$this->entityManager->flush();

return $data;
}
}
< /code>
Now try the same request:
POST /users/00000000-0000-0000-0000-000000000001/emails
{
"email": "aaa@test.com"
}
< /code>
201 Created

Код: Выделить всё

{
"uuid": "988a50a6-f77f-47aa-b5de-eaa5029fb1f2",
"email": "aaa@test.com",
"user": "/users/00000000-0000-0000-0000-000000000001"
}
< /code>
It worked! One more time with a different email:
POST /users/00000000-0000-0000-0000-000000000001/emails
{
"email": "bbb@test.com"
}
< /code>
201 Created

Код: Выделить всё

{
"uuid": "988a50a6-f77f-47aa-b5de-eaa5029fb1f2",
"email": "bbb@test.com",
"user": "/users/00000000-0000-0000-0000-000000000001"
}
< /code>
Wrong. I received a 201 Created
код ответа и электронная почта верны. Однако uuid то же самое. Предыдущий ресурс был обновлен или воссозданный . Если я попробую это с другим пользователем Uuid, он будет работать в первый раз, но последующие попытки показывают ту же проблему.


Подробнее здесь: https://stackoverflow.com/questions/797 ... ad-of-crea
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»