Symfony ObjectMapper не работает с реляционным свойствомPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Symfony ObjectMapper не работает с реляционным свойством

Сообщение Anonymous »

Для плоских структур все работает отлично. Однако я не могу сериализовать автора под вызовом API в /api/books. Здесь они описывают рекурсию: https://symfony.com/doc/current/object_ ... -recursion, но, похоже, она не соответствует реализации. Есть идеи по этому поводу?!
PHP 8.3, Symfony 7.4 с symfony/object-mapper 7.4
И я не могу найти ответ здесь: https://api-platform.com/docs/core/dto/
Ошибка:
Невозможно прочитать свойство "App\Entity\Author" в классе "App\Entity\Book"."
Или (удалив #[Map(source: Author::class) в BookCollectionResponseDTO):
"App\Dto\Book\Response\BookCollectionResponseDto::__construct(): Аргумент №2 ($author) должен иметь тип ?App\Dto\Author\Response\AuthorResponseDto, Заданы прокси\CG\App\Entity\Author, вызываемые в /var/www/html/vendor/symfony/object-mapper/ObjectMapper.php в строке 170
IdentifyingEntity:
Упорядочивает id и uuid для каждого объекта.
App\Entity\Book.php
class Book implements EntityInterface
{
use IdentifiableEntity;

#[Column(type: Types::STRING, length: 180)]
private string $title;

#[ManyToOne(targetEntity: Author::class)]
#[JoinColumn(referencedColumnName: 'id', nullable: true)]
private ?Author $author;
}

App\Entity\Author.php
class Author implements EntityInterface
{
use IdentifiableEntity;

#[Column(type: Types::STRING, length: 180)]
private string $name;
}

App\Dto\Book\Response\BookCollectionResponseDto.php
#[ApiResource(
shortName: 'book',
operations: [],
)]
#[Map(source: Book::class)]
final readonly class BookCollectionResponseDto implements ResponseDto
{
public function __construct(
#[SerializedName('uuid'), Assert\NotBlank]
#[ApiProperty(readable: false, identifier: true)]
public Uuid $uuid,

#[SerializedName('title'), Assert\NotBlank]
public string $title,

#[ApiProperty(readableLink: false)]
#[Map(source: Author::class)] /** tested with and without this line **/
public ?AuthorResponseDto $author,
) {}
}

App\Dto\Author\Response\AuthorResponseDto.php
#[ApiResource(
shortName: 'author',
operations: [],
)]
#[Map(source: Author::class)]
final readonly class AuthorResponseDto implements ResponseDto
{
public function __construct(
#[SerializedName('uuid'), Assert\NotBlank]
#[ApiProperty(readable: false, identifier: true)]
public Uuid $uuid,

#[SerializedName('name'), Assert\NotBlank]
public string $name,
) {}
}

App\Dto\Book.php (для операций)
#[ApiResource(
shortName: 'book',
stateOptions: new Options(entityClass: Book::class),
)]
#[GetCollection(
output: BookCollectionResponseDto::class,
)]
final readonly class Book
{
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... l-property
Ответить

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

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

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

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

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