Akuma
@Akuma
Веб-программист

Почему JMSSerializerBundle игнорирует аннотации?

Добрый вечер,


указанный выше банд полностю игнорирует аннотации в сущностях.

Например:

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;
use FOS\UserBundle\Entity\User as BaseUser;

/**
 * Модель пользователя
 *
 * @ORM\Entity
 * @ORM\Table(name="user")
 *
 * @JMS\ExclusionPolicy("all")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * @JMS\Expose
     */
    protected $id;

    /**
     * @ORM\ManyToMany(targetEntity="UserGroup")
     * @ORM\JoinTable(name="user_group_relation",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
     * )
     * @JMS\Exclude
     */
    protected $groups;
}



Для проверки что он вообще работает, в настройках задан длинный разделитель:
jms_serializer:
    metadata:
        cache: file
        debug: "%kernel.debug%"
        auto_detection: true
    property_naming:
        separator: "____"
        lower_case: true


* Кеш очищал. Пробовал менять тип, игрался с другими параметрами


На выходе получаем:
[
    {
        "id": 3,
        "username": "Admin",
        "username____canonical": "admin",
        "email": "ОТРЕЗАНО",
        "email____canonical": "ОТРЕЗАНО",
        "enabled": true,
        "salt": "2ov3jq7rg12cwgck8kgs440wsc4swk8",
        "password": "e4de2c084971ef0183ac507bce41ee1d57949de86e94b498f1ba8acc4f192af310282a6981d06e96db2d32e7402fdf0ef4d664c97b034e8eb0d8f0ed81a228e7",
        "last____login": "2013-05-17T19:34:25+0400",
        "groups": [
        {
            "id": 1,
            "name": "Администратор",
            "roles": [
            "ROLE_CMS"
            ]
        }
        ],
        "locked": false,
        "expired": false,
        "roles": [
        ],
        "credentials____expired": false
    }
]



Сделал composer update

Симфония сейчас 2.1.10


Вычитал гдето, что он конфликтует с FOSRestBundle и там рекомендовали поставить специальную версию — не помогло.


Такое чувство, что гдето я что-то забыл. Может кто-то сталкивался?
  • Вопрос задан
  • 3563 просмотра
Пригласить эксперта
Ответы на вопрос 2
Akuma
@Akuma Автор вопроса
Веб-программист
Путем большого гугления выяснилось, что ответ был совсем рядом. Так почему бы его не выложить на обозрение, вдруго кому пригодится.

Из-за наследования класса из FOSUserBundle аннотации не срабатывали.
Вот заветная тема с решением: stackoverflow.com/questions/12960141/jmsserializerbundle-no-control-over-third-party-meta-data

Нужно просто создать yml конфиг для Model`и пользователя из FOSUserBundle.

* Symfony 2.3
Ответ написан
Комментировать
Lebnik
@Lebnik
$serializer = SerializerBuilder::create()
            ->setSerializationContextFactory(function () {
                return \JMS\Serializer\SerializationContext::create()
                    ->setSerializeNull(true)
                    ;
            })
            ->setDeserializationContextFactory(function () {
                return \JMS\Serializer\DeserializationContext::create()
                    ->setSerializeNull(true)
                    ;
            })
            ->setAnnotationReader($annotationReader)
            ->setPropertyNamingStrategy(new SerializedNameImportantThanPropertyNameStrategy())
            ->build();

Ignoring some parent classes: CComponent, CModel, CActiveRecord
$class = new \ReflectionClass($serializer);
        $property = $class->getProperty('navigator');
        $property->setAccessible(true);
        $navigator = $property->getValue($serializer);

        $class = new \ReflectionClass($navigator);
        $property = $class->getProperty('metadataFactory');
        $property->setAccessible(true);
        $metadataFactory = $property->getValue($navigator);

        $class = new \ReflectionClass($metadataFactory);
        $property = $class->getProperty('loadedClassMetadata');
        $property->setAccessible(true);
        $property->setValue($metadataFactory, [
            'CComponent' => new NullMetadata(new \stdClass()),
            'CModel' => new NullMetadata(new \stdClass()),
            'CActiveRecord' => new NullMetadata(new \stdClass()),
        ]);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы