我在我的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)
我希望我的结果集只包含选定的表和关联.
任何帮助将不胜感激.
我有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 …
我正在尝试使用带有@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覆盖现有属性?
我在使用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) 我用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) 我有实体:
<?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) 我在使用组序列化具有许多关系的实体时遇到问题.我有这样一个序列化相关实体的问题.
假设我有两个实体:产品和相关元素.
/**
*
* @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) 我正在尝试添加一个序列化方法,但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的示例.
语法是否正确?怎么了?
谢谢.
我正在尝试通过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)