在使用一个附加字段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"
}
的配置而不是FOSUserBundle的基本用户实体,但我不知道如何实现它。
答案 0 :(得分:4)
这就是我解决问题的方法。我有一个User.php类 从FOS \ UserBundle \ Model \ User继承为BaseUser。我需要从 BaseUser 类和我的用户类控制序列化。
解决方案:您需要2个独立的配置文件来控制每个类。
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: true
Entity.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;
在配置文件中的每次更改后清除缓存。
缓存:明确
答案 1 :(得分:0)
之所以会发生这种情况,是因为您在父实体上使用exclusion_policy: all
,而不是在子实体上,而子实体仍然暴露了它的所有属性。
你应该在jms_seriazlier:目录下的配置(config.yml
)中切换到你的包。
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: true