标签: jmsserializerbundle

使用JMS Serializer时禁用Doctrine 2延迟加载?

我在我的Zend项目中使用Doctrine 2 ORM,并且需要在几种情况下将我的实体序列化为JSON.

ATM我使用Querybuilder并加入我需要的所有表.但是我的序列化程序导致学说延迟加载每个相关的实体,导致相当大的数据量并引发递归.

现在我正在寻找一种完全禁用Doctrines延迟加载行为的方法.

我选择数据的方法如下:

$qb= $this->_em->createQueryBuilder()
            ->from("\Project\Entity\Personappointment", 'pa')
            ->select('pa', 't', 'c', 'a', 'aps', 'apt', 'p')
            ->leftjoin('pa.table', 't')
            ->leftjoin('pa.company', 'c')
            ->leftjoin('pa.appointment', 'a')
            ->leftjoin('a.appointmentstatus', 'aps')
            ->leftjoin('a.appointmenttype', 'apt')
            ->leftjoin('a.person','p')
Run Code Online (Sandbox Code Playgroud)

我希望我的结果集只包含选定的表和关联.

任何帮助将不胜感激.

php doctrine serializer jmsserializerbundle

15
推荐指数
2
解决办法
1万
查看次数

为什么JMS Serializer忽略嵌套集合的映射?

我有OneToMany关系中的实体:

预测 - >有很多 - >砖块

我为Resources/config/serializer/Entity.xxx.ymlxxx是实体名称的每个人创建了序列化映射.

每个实体都将排除策略设置为ALL,并且其中一些属性被公开,例如:

Acme\ForecastBundle\Entity\Forecast:   
  exclusion_policy: ALL   
  xml_root_name: forecast   
  properties:
    id:
      expose: true
      type: integer
    regionUid:
      expose: true
      type: string
    description:
      expose: true
      type: string
    bricks:
      expose: true
      type: array<Acme\ForecastBundle\Entity\Brick>
      xml_list:
        inline: true
        entry_name: brick
Run Code Online (Sandbox Code Playgroud)

在我的模板中,我{{ forecast|serialize|raw }}得到了:

预测 - >正如我所料 - >只有暴露的字段被序列化

砖块集合 - >所有属性都被序列化 - >似乎我Entity.Brick.yml被忽略了......为什么?

在砖块我只有ID和名称暴露..但在序列化输出我有所有属性(created_at,updated_at ..等等)..为什么?它们应该被"exclusion_policy:ALL"排除在外.似乎没有使用嵌套集合的配置.

Acme\ForecastBundle\Entity\Brick:   
  exclusion_policy: ALL   
  xml_root_name: brick
  properties:
    id:
      expose: true
      type: integer
    name:
      expose: true
      type: string
Run Code Online (Sandbox Code Playgroud)

编辑:

是的,我在.yml配置中的每次更改后都清除了缓存

在提出一些建议之后,我将@ExclusionPolicy("ALL")注释添加到Brick类和@Expose on …

serialization symfony jmsserializerbundle

12
推荐指数
1
解决办法
6814
查看次数

如何从@Groups包含策略更新symfony2/doctrine实体JMSSerializer反序列化实体

我正在尝试使用带有@ExclusionPolicy的JMSSerializer来更新symfony2/doctrine实体:无@Groups包含策略.

 * @Serializer\ExclusionPolicy("none")
 */
 class Foo
 {
    /**
     * @Serializer\Groups({"flag","edit"})
     */
    protected $id;

    /**
     * @Serializer\Groups({"edit"})
     */
    protected $name;

    /**
     * @Serializer\Groups({"flag"})
     */
    protected $flag;

    /**
     * @Serializer\Exclude()
     */
    protected $createdBy;
 }
Run Code Online (Sandbox Code Playgroud)

参考:http://jmsyst.com/libs/serializer/master/reference/annotations

以下记录的结果:

Foo (id:1, name:'bar', flagged:false ,created_by:123)
Run Code Online (Sandbox Code Playgroud)

使用Group包含序列化以避免序列化我不需要的信息(关联,blob等等)所以当我想更新实体时,我只从JSON反序列化实体的更新字段.

$foo->setFlagged(true);
$data = $serializer->serialize($foo, 'json', SerializationContext::create()->setGroups(array("flag")));

result:
{id:1,flagged:true}
Run Code Online (Sandbox Code Playgroud)

传递回应用程序时反序列化为实体

$foo = $serializer->deserialize($jsonFoo,'Foo','json');

result:
Foo (id:1, name:null, flagged:true, created_by:null)
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试将实体合并回到主题实体管理器时:

$foo = $em->merge($foo);
$em->persist($foo);
$em->flush();
Run Code Online (Sandbox Code Playgroud)

生成的foo尝试使用null更新排除的属性(name,created_by).

如何告诉JMSSerializer或Doctrine Entity Manager合并我不想用null覆盖现有属性?

symfony doctrine-orm jmsserializerbundle

11
推荐指数
1
解决办法
5506
查看次数

JMS Serializer忽略Knp Paginator的映射

我在使用JMS Serializer排除某些KNP Paginator属性时遇到问题.

首先,它包含在composer.json中

...
"jms/serializer-bundle": "~0.13",
"knplabs/knp-paginator-bundle": "2.4.*@dev",
...
Run Code Online (Sandbox Code Playgroud)

我正在对CrmContacts实体进行分页,并且该实体的排除策略运行良好.我还为KNP Paginator添加了yml文件,如下所示:

config.yml

jms_serializer:
    metadata:
        directories:
            KNPPB:
                namespace_prefix: 'Knp\\Bundle\\PaginatorBundle'
                path: %kernel.root_dir%/Resources/serializer/Knp
Run Code Online (Sandbox Code Playgroud)

在app/Resources/serializer/Knp文件夹中我创建了Pagination.SlidingPagination.yml:

Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination:
    exclusion_policy: ALL
        properties:
            items:
                expose: true
                access_type: public_method
                accessor:
                    getter: getItems
                type: array
                serialized_name:
                    payload
            currentPageNumber:
                expose: true
                serialized_name:
                    page
            numItemsPerPage:
                expose: true
                serialized_name:
                    items
            totalCount:
                expose: true
                serialized_name:
                    totalItems
Run Code Online (Sandbox Code Playgroud)

这是返回序列化数据的逻辑:

public function getContactsAction(Request $request)
{

    $limit = $request->query->getInt('l', 10);
    $page = $request->query->getInt('p', 1);

    $serializer = $this->get('jms_serializer');

    $contacts = $this->getDoctrine()
        ->getManager()
        ->getRepository('AcmeContactsBundle:CrmContact')
        ->getContacts();

    $paginator = $this->get('knp_paginator');
    $pagination …
Run Code Online (Sandbox Code Playgroud)

jmsserializerbundle knppaginator

10
推荐指数
1
解决办法
3457
查看次数

JMS Serializer不会暴露一个属性

我用Symfony和FOSRestBundle创建了一个RESTful应用程序.FOSRestBundle使用JMS Seriazlizer将数据序列化为json格式.我有一切都在处理一个小问题.

这是我的Entity类

/**
 * Post
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Tomalo\AdminBundle\Entity\PostRepository")
 * @ExclusionPolicy("none")
 */
class Post
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="content", type="text")
     * @Assert\NotBlank()
     */
    private $content;

    /**
     * @var float
     *
     * @ORM\Column(name="lat", type="float")
     * @Assert\NotBlank()
     */
    private $lat;

    /**
     * @var float
     *
     * @ORM\Column(name="lon", type="float")
     * @Assert\NotBlank()
     */
    private $lon;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date", type="datetime")
     */ …
Run Code Online (Sandbox Code Playgroud)

json symfony fosrestbundle jmsserializerbundle

9
推荐指数
2
解决办法
8702
查看次数

Symfony2,FOSRestBundle.如何使用JMSSerializerBundle组?

我有实体:

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\Groups;
//...


 /**
   * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
  **/
 class User extends BaseUser
 {
   /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    * @Groups({"default"})
   */
protected $id;

/**
 * @ORM\ManyToMany(targetEntity="StorageBundle\Entity\File")
 * @ORM\JoinTable(name="users_photos",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="photo_id", referencedColumnName="id", onDelete="CASCADE")}
 *      )
 * @Groups({"default"})
 */
protected $photoFiles;

/**
 * @ORM\Column(type="string", length=255, nullable=true, unique=false)
 * @Groups({"notification"})
 */
protected $deviceId;

 /**
 * @ORM\Column(type="string", length=255, nullable=true, unique=false)
  *     @Groups({"default"})
 */
protected $name;

/**
 * @ORM\OneToOne(targetEntity="AppBundle\Entity\Car", mappedBy="driver")
 * @Groups({"driver"})
 */ …
Run Code Online (Sandbox Code Playgroud)

symfony fosrestbundle jmsserializerbundle

9
推荐指数
1
解决办法
7458
查看次数

9
推荐指数
1
解决办法
7480
查看次数

JMSSerializerBundle具有关系的实体中的序列化组

我在使用组序列化具有许多关系的实体时遇到问题.我有这样一个序列化相关实体的问题.

假设我有两个实体:产品和相关元素.

/**
 *
 * @Serializer\ExclusionPolicy("none")
 */
class Product {

    /**
     * Primary key
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * 
     * @Serializer\Groups({"list","details"})
     * @Serializer\Type("integer")
     */
    protected $id;

    /**
     * @Serializer\Groups({"list","details"})
     * @Serializer\Type("string")
     */
    protected $name;

    /**
     * @ORM\Column(name="description", type="string", length=4096, nullable=true)
     * 
     * @Serializer\Groups({"details"})
     * @Serializer\Type("string")
     */
    protected $description;

    /**
     * @var ArrayCollection
     * 
     * @ORM\OneToMany(targetEntity="Madden\ProjectBundle\Entity\ProjectResource", mappedBy="project")
     * @Serializer\Groups({"details"})
     * @Serializer\Type("ArrayCollection<Element>")
     */
    protected $details1;

    /**
     * Relation to project tasks
     * @ORM\OneToMany(targetEntity="Madden\ProjectBundle\Entity\ProjectTask", mappedBy="project") …
Run Code Online (Sandbox Code Playgroud)

symfony doctrine-orm jmsserializerbundle

8
推荐指数
1
解决办法
6466
查看次数

JMS Serialize @VirtualProperty不起作用

我正在尝试添加一个序列化方法,但JMS Serialize不会显示该字段.

use JMS\Serializer\Annotation\Groups;
use JMS\Serializer\Annotation\VirtualProperty;
use JMS\Serializer\Annotation\SerializedName;

class Ads
{   
    /**
     * @VirtualProperty
     * @Type("string")
     * @SerializedName("Foo")
     * @Groups({"manage"})
     */
    public function foo(){
        $foo = 'foo';
        return $foo;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后:

use JMS\Serializer\SerializationContext;
use JMS\Serializer\SerializerBuilder;

...

$context = new SerializationContext();
$context->setGroups(array('manage'));

$serializer = JMS\Serializer\SerializerBuilder::create()->build();
$jsonContent = $serializer->serialize($ad, 'json', $context);
Run Code Online (Sandbox Code Playgroud)

我还没有看到任何如何使用VirtualProperty的示例.

语法是否正确?怎么了?

谢谢.

php symfony jmsserializerbundle

8
推荐指数
1
解决办法
1万
查看次数

FOSRestbundle,JMS Serializer和SonataMediaBundle返回图像的公共URL

我正在尝试通过FOSRestBundle和JMS Serializer将带有ManyToOne链接的JSON对象('Module')返回到Sonata\MediaBundle\Entity.我应该怎么做呢?

这是我做过的黑客攻击,但不认为这是最好的做法.

class Module
{
    ...
    /**
     * @var Application\Sonata\MediaBundle\Entity\Media
     *
     * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media",  inversedBy="module")
     * @ORM\JoinColumn(name="hero_image_id", referencedColumnName="id")
     * @JMS\Expose()
     */
    private $heroImage;
    ...
}

class Media extends BaseMedia
{
   ...
   /**
     * A Quick hack not the best method.
     *
     * @JMS\VirtualProperty
     * @JMS\SerializedName("url")
     *
     * @return string
     */
    public function getUrlMethod()
    {
        global $kernel;

        $imageProvider = $kernel->getContainer()->get('sonata.media.provider.image');

        return $imageProvider->generatePublicUrl($this, 'reference');
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

编辑 感谢Tautrimas Pajarskas和他提到的帖子.这是班级.

<?php
namespace AXO\APIBundle\Listener\Serialization;

use JMS\DiExtraBundle\Annotation\Service;
use JMS\DiExtraBundle\Annotation\Tag;
use JMS\DiExtraBundle\Annotation\Inject;
use JMS\DiExtraBundle\Annotation\InjectParams; …
Run Code Online (Sandbox Code Playgroud)

jms symfony-sonata jmsserializerbundle

8
推荐指数
1
解决办法
1475
查看次数