当将User实例序列化为一个额外的字段$name时,我遇到了一个问题,该字段从FOSUserBundle扩展了基本用户:
<?php
namespace AppBundle\Entity\User;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
/**
* User
*/
class User extends BaseUser
{
/**
* @var string
*/
private $name;
/**
* Set name
* @param string $name
* @return User
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
* @return string
*/
public function getName()
{
return $this->name;
}
}为了简化,我只需要使用$salt从用户实体中公开JMSSerializerBundle字段。
#AppBundle\Resources\config\serializer\Model.User.yml
FOS\UserBundle\Model\User:
exclusion_policy: all
properties:
salt:
expose: true下面是它的配置:
#app\config\config.yml
jms_serializer:
metadata:
auto_detection: true
directories:
FOSUserBundle:
namespace_prefix: "FOS\\UserBundle"
path: "@AppBundle/Resources/config/serializer"问题是序列化程序也公开$name字段的,我不想这样做,因为我只需要公开$salt:
{
"salt": "abcdefg",
"name": "Admin"
}我认为我需要告诉序列化程序为我的AppBundle\Entity\User使用配置,而不是使用FOSUserBundle的基本用户实体,但我不知道如何实现它。
发布于 2017-04-19 13:24:58
我就是这样解决这个问题的。我有一个User.php类,作为BaseUser继承自FOS\UserBundle\Model\User。我需要控制来自我的BaseUser类和用户类的序列化。
解决方案:您需要两个分开的配置文件来控制每个类。
config.yml
#Serializer configuration
jms_serializer:
metadata:
directories:
AppBundle:
path: "@AppBundle/Resources/config/serializer"
FOSUB:
namespace_prefix: "FOS\\UserBundle"
path: "%kernel.root_dir%/serializer/FOSUB"Model.User.yml
FOS\UserBundle\Model\User:
exclusion_policy: ALL
properties:
id:
expose: true
username:
expose: true
email:
expose: true
enabled:
expose: trueEntity.User.yml
AppBundle\Entity\User:
exclusion_policy: ALL
properties:
imageAvatar:
expose: true
updatedAt:
expose: true
namespace AppBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* User
*
* @ORM\Table(name="usuario")
* @ORM\Entity(repositoryClass="DietaBundle\Repository\UserRepository")
*
*
*/
class User extends BaseUser
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=255)
*
* @var string
*/
private $imageAvatar;
/**
* @ORM\Column(type="datetime")
*
* @var \DateTime
*/
private $updatedAt;在每次更改配置文件后清除缓存。
缓存:清除
发布于 2015-07-14 10:18:58
之所以会出现这种情况,是因为您在父实体上使用exclusion_policy: all,而不是在子实体上使用它,而子实体仍然公开它的所有属性。
您应该在配置(config.yml)中切换到jms_seriazlier:directories下的包。
any-name:
namespace_prefix: "My\\FooBundle"
path: "@MyFooBundle/Resources/config/serializer"现在,您可以使用相同的配置只公开所需的属性。
#AppBundle\Resources\config\serializer\Entity.User.yml
My\FooBundle\Entity\User:
exclusion_policy: all
properties:
salt:
expose: truehttps://stackoverflow.com/questions/31402421
复制相似问题