当我json_encode一个Doctrine实体时,如何使用getter方法作为属性?

时间:2017-12-14 21:27:57

标签: php symfony doctrine-orm

例如,在班级

/**
 * @Doctrine\ORM\Mapping\Entity
 */
class Example
{
    /**
     * @var int The id
     *
     * @Doctrine\ORM\Mapping\Id
     * @Doctrine\ORM\Mapping\GeneratedValue
     * @Doctrine\ORM\Mapping\Column(type="integer")
     */
    public $id;

    /**
     * @var string
     *
     * @Doctrine\ORM\Mapping\Column(type="string")
     */
    public $name;


    public function getRandomNumber()
    {
        return rand();
    }
}

当我使用此实体调用json_encode()时,它不会将getRandomNumber()值作为类的属性。

我希望它返回:

{
    "id": 1,
    "name": "foo",
    "randomNumber": 123456
}

但它返回:

{
    "id": 1,
    "name": "foo"
}

4 个答案:

答案 0 :(得分:1)

json_encode将返回一个JSON对象,该对象具有传递给它的对象的公共属性。如果要包含randomNumber,可以将其设为公共属性,并将其设置为

之类的构造函数
/**
 * @Doctrine\ORM\Mapping\Entity
 */
class Example
{
    /**
     * @var int The id
     *
     * @Doctrine\ORM\Mapping\Id
     * @Doctrine\ORM\Mapping\GeneratedValue
     * @Doctrine\ORM\Mapping\Column(type="integer")
     */
    public $id;

    /**
     * @var string
     *
     * @Doctrine\ORM\Mapping\Column(type="string")
     */
    public $name;

    /**
     * @var int
     */
    public $randomNumber;

    public function __construct() {
      $this->randomNumber = $this->getRandomNumber();
    }

    public function getRandomNumber()
    {
        return rand();
    }
}

对于更复杂的对象序列化,您可能需要查看the symfony serializer

答案 1 :(得分:1)

您可以实现接口\JsonSerializable来指定应序列化为JSON的数据:

class Example implements \JsonSerializable
{
    // ...

    public function jsonSerialize()
    {
        // mixed data which can be serialized by json_encode() 
        return array(
            'id' => $this->id,
            'name' => $this->name,
            'randomNumber' => $this->getRandomNumber(),
        );
    }
}

答案 2 :(得分:1)

你应该使用JMSSerializer包! 我在我的所有网站都使用它,这真的是一个很好的解决方案。 https://jmsyst.com/libs/serializer 它使用注释,并创建json序列化实体。它接受实体的属性值,但是使用特定的注释@Accessor,它使用指定的getter来获取其值。 例如:

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

/**
 * @Expose
 * @Accessor("getRandomNumber")
 */
public $randomNumber;

public function getRandomNumber(){
    return rand();
}

答案 3 :(得分:1)

使用虚拟财产

信息:https://jmsyst.com/libs/serializer/master/reference/annotations#virtualproperty

/**
 * @Doctrine\ORM\Mapping\Entity
 */
class Example
{
    /**
     * @var int The id
     *
     * @Doctrine\ORM\Mapping\Id
     * @Doctrine\ORM\Mapping\GeneratedValue
     * @Doctrine\ORM\Mapping\Column(type="integer")
     */
    public $id;

    /**
     * @var string
     *
     * @Doctrine\ORM\Mapping\Column(type="string")
     */
    public $name;

    /**
     * @Serializer\VirtualProperty()
     */
    public function getRandomNumber()
    {
        return rand();
    }
}