symfony - JMS 序列化包 @exclude 注释不起作用

标签 symfony

我的实体 FosUserBundle

namespace AppBundle\Entity;

use JMS\Serializer\Annotation\Expose;
use JMS\Serializer\Annotation\Exclude;
use JMS\Serializer\Annotation\ExclusionPolicy;

use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
use FOS\UserBundle\Model\Group;

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
 * @ExclusionPolicy("all")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * @Exclude
     */
    protected $id;

    /**
     * @ORM\Column(type="integer")
     */
    private $balance = 0;

但是如果我尝试序列化 App\Entity\User 对象:
$this->get('jms_serializer')->serialize($user, 'json');

它返回了我的 ID 字段!
 {
  "id": 1,
  "username": "admin",
  "username_canonical": "admin",
  "email": "admin",
  "email_canonical": "admin",
  "enabled": true,
  "salt": "o12yxgxp3vkk0w4sck80408w8s8o84s",
  "password": "$2y$13$o12yxgxp3vkk0w4sck804uSVjSMSB1W0qwEjunGTHomBqqoGvkW9G",
  "last_login": "2016-02-28T17:28:19+0300",
  "locked": false,
  "expired": false,
  "roles": [
    "ROLE_ADMIN"
  ],
  "credentials_expired": false
}

最佳答案

由于 FOSUserBundle 序列化器规则,您的排除策略将不起作用。

要使用排除项,您需要告诉 JMSSerializer 压缩 FOSUB 序列化。

在您的 config.yml ,添加以下内容:

jms_serializer:
    metadata:
        auto_detection: true # Don't forget this line
        directories:
            FOSUB:
                namespace_prefix: FOS\UserBundle
                path: %kernel.root_dir%/serializer/FOSUB

然后,创建文件 app/serializer/FOSUB/Model.User.yml并将以下内容粘贴到:
FOS\UserBundle\Model\User:
    exclusion_policy: ALL

现在,所有继承的属性都被排除在外,您可以公开您想要的内容。

如果您想保留某些属性,或在您的实体中重新定义它们,请根据您的需要进行调整。

查看对应问题#78 .

更新

对于不工作的@Expose 注释,添加 auto_detection就像我之前的例子一样。

如果这不能解决问题,请使用 @Groups注释并执行以下操作:
use JMS\Serializer\Annotation\Groups;

/**
 * @ORM\Column(type="integer")
 * @JMS\Groups({"user"})
 */
private $balance = 0;

像这样改变你的 Controller :
use JMS\Serializer\SerializationContext;

$context = SerializationContext::create()->setGroups(array('user'));
$serializer->serialize($user, 'json', $context);

它应该有效。

请记住,此问题仅存在是因为您的 User 实体扩展了一个已经具有序列化规则的类。

关于symfony - JMS 序列化包 @exclude 注释不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35684725/

相关文章:

php - 如何在 Symfony2 中使用 jquery/Ajax 从 PHP 文件中获取数组字段值?

javascript - 如何通过结帐在我的 Controller 上获取 Stripe token ?

PHP - session 对象销毁失败

symfony - elasticbundle搜索索引

php - Symfony2 - security.yml 中 `anonymous.key` 的用途

Symfony2 - 将 Google Analytics 脚本添加到 Twig 中

symfony - 如何从服务: $this->container->getParameter ('kernel.cache_dir' )获取缓存目录

php - Symfony2 防火墙需要很长时间

php - Symfony 错误 The class XXX was not found in the chain configured namespaces XXX

css - 在同一行对齐表单输入