BonBonSlick
@BonBonSlick
Web Developer Trainee

Symfony serializer доступ к динамическим, виртуальным полям?

Усталь.
Сделал скрипт который асайнит динамические поля для сериализации на фронт, очень удобно просто вызвать метод из трейта на сущность которую хотим перевести для АПИ ответа , вот только сериалайзер ругается что нет доступа к динамическому полю. Думал можно избежать тучи дополнительных сериалайз файлов и ДТО т.к. уже есть сериалайзер для самой сущности. Использовать кверибилдер лень, а нативный СЕ КУ ЕЛЬ долго.
Цель, выплюнуть клиенту сущность с локализованными полями + дефолтьный первод полей которых нет в локали. , локали всегда есть в запросе, дефолтная или кастомная.
К примеру, локаль дефолтная английкая, приходит в запросе русский, но в русском не все поля переведы, для этого дефолтная локаль.
public function withLocalizedFields(Locale $locale, Locale $defaultLocale): self {
        $translation = $this->translationByLocale($locale);
        $defaultTrans = $this->translationByLocale($defaultLocale);
        if (false === $translation instanceof ITranslation && false === $defaultTrans instanceof ITranslation) {
            throw new NotTranslatedEntity('No translation');
        }
        foreach ($defaultTrans->publicProperties() as $property) {
            $property->setAccessible(true);
            $propName = $property->getName();
            if (false === $translation->$propName instanceof AbstractStrVO) {
                continue;
            }
            $this->$propName = false === empty($translation->$propName->value()) ?
                $translation->$propName->value() :
                $defaultTrans->$propName->value();
        }
        return $this;
    }

EXCEPTION /...dor/symfony/property-access/PropertyAccessor.php. 
Message: Can't get a way to read the property "name" in class "App\Entity\Anime".. Code: 0 [] []

Хотя перед тем как делать сериализацию поле есть
dd($entity->name);
  $this->serializer->serialize($data, JsonEncoder::FORMAT, ['groups' => $serializeContext]), // динамических полей - нет


<?xml version="1.0" encoding="UTF-8" ?>
<!--
  ~ (c) BonBonSlick - 5/30/21, 6:24 PM
  -->

<!--
  ~ (c) BonBonSlick
  -->

<serializer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://symfony.com/schema/dic/serializer-mapping"
            xsi:schemaLocation="http://symfony.com/schema/dic/serializer-mapping
        http://symfony.com/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd"
>
    <class name="App\Entity\Anime">
        <attribute name="name">
            <group>public.info</group>
        </attribute>
        <attribute name="description">
            <group>non_sensitive_data</group>
        </attribute>
    </class>
</serializer>

"symfony/serializer": "^5.2",
https://symfony.com/doc/current/components/seriali...
Схожий СО вопрос
  • Вопрос задан
  • 34 просмотра
Решения вопроса 1
BonBonSlick
@BonBonSlick Автор вопроса
Web Developer Trainee
1 - обязательно аннотации
*
 * @property string $name
 * @property string $description
 */
class Anime extends AbstractSluggableAggregateRoot implements ITranslatable {


И метод для доступа к виртуальному параметру
public function name(): string {
        return $this->name ?? '';
    }


Тогда сериалайзер получит доступ к динамическому параметру.
В JMSerializer ето можно сделать при помощи пометки VirtualProperty в маппинге сериалайзера.
В симфони надо предоставить доступ. Читать будет метод name(), а не параметр.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы