Для плоских структур все работает отлично. Однако я не могу сериализовать автора под вызовом 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
Symfony ObjectMapper не работает с реляционным свойством ⇐ Php
Кемеровские программисты php общаются здесь
-
Anonymous
1766613843
Anonymous
Для плоских структур все работает отлично. Однако я не могу сериализовать автора под вызовом API в /api/books. Здесь они описывают рекурсию: https://symfony.com/doc/current/object_mapper.html#handling-recursion, но, похоже, она не соответствует реализации. Есть идеи по этому поводу?!
PHP 8.3, Symfony 7.4 с symfony/object-mapper 7.4
И я не могу найти ответ здесь: https://api-platform.com/docs/core/dto/
[b]Ошибка:[/b]
Невозможно прочитать свойство "App\Entity\Author" в классе "App\Entity\Book"."
[b]Или (удалив #[Map(source: Author::class) в BookCollectionResponseDTO):[/b]
"App\Dto\Book\Response\BookCollectionResponseDto::__construct(): Аргумент №2 ($author) должен иметь тип ?App\Dto\Author\Response\AuthorResponseDto, Заданы прокси\[b]CG[/b]\App\Entity\Author, вызываемые в /var/www/html/vendor/symfony/object-mapper/ObjectMapper.php в строке 170
[b]IdentifyingEntity:[/b]
Упорядочивает id и uuid для каждого объекта.
[b]App\Entity\Book.php[/b]
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;
}
[b]App\Entity\Author.php[/b]
class Author implements EntityInterface
{
use IdentifiableEntity;
#[Column(type: Types::STRING, length: 180)]
private string $name;
}
[b]App\Dto\Book\Response\BookCollectionResponseDto.php[/b]
#[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,
) {}
}
[b]App\Dto\Author\Response\AuthorResponseDto.php[/b]
#[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,
) {}
}
[b]App\Dto\Book.php[/b] (для операций)
#[ApiResource(
shortName: 'book',
stateOptions: new Options(entityClass: Book::class),
)]
#[GetCollection(
output: BookCollectionResponseDto::class,
)]
final readonly class Book
{
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79854613/symfony-objectmapper-fails-on-relational-property[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия