26

JMS シリアライザーを使用してエンティティ関係をシリアライズしようとしています。

エンティティは次のとおりです。

class Ad
{ 

    /**
     * @Type("string")
     * @Groups({"manage"})
     * 
     * @var string
     */
    private $description;

    /**
     * @Type("Acme\SearchBundle\Entity\Country")
     * @Groups({"manage"})
     * 
     * @var \Acme\SearchBundle\Entity\Country
     */
    private $country;

    /**
     * @Type("string")
     * @Groups({"manage"})
     * 
     * @var string
     */
    private $title;

    /**
     * Set description
     *
     * @param string $description
     * @return Ad
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Set country
     *
     * @param \Acme\SearchBundle\Entity\Country $country
     * @return Ad
     */
    public function setCountry($country)
    {
        $this->country= $country;

        return $this;
    }

    /**
     * Get country
     *
     * @return string 
     */
    public function getCountry()
    {
        return $this->country;
    }

    /**
     * Set title
     *
     * @param string $title
     * @return Ad
     */
    public function setTituloanuncio($title)
    {
        $this->title = $title;

        return $this;
    }

    /**
     * Get title
     *
     * @return string 
     */
    public function getTitle()
    {
        return $this->title;
    }

}

そして関係のエンティティ:

class Country
{

    /**
     * @Type("string")
     * @Groups("manage")
     * 
     * @var string
     */
    private $id;

    /**
     * @Type("string")
     * @Groups("admin")
     * 
     * @var string
     */
    private $description;

    /**
     * Set description
     * @Groups("")
     *
     * @param string $description
     * @return Country
     */
    public function setDescripcionpais($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    }

    /**
     * Get id
     *
     * @return string 
     */
    public function getId()
    {
        return $this->id;
    }
}

エンティティをシリアル化しますが、国属性を単純なフィールドに変換する方法がわかりません。

私はjsonでこの結果を取得します:

{"description":"foo", "title":"bar", "country":{"id":"en"} }

しかし、次のように国の id フィールドを取得したい:

{"description":"foo", "title":"bar", "country": "en" }

JMSシリアライザーで可能ですか?

ありがとうございました。

[編集]

@VirtualProperty は機能しません。

4

6 に答える 6

28

@VirtualPropertyはい、注釈を使用できます。

/**
 * @VirtualProperty
 * @SerializedName("foo")
 */
public function bar()
{
    return $this->country->getCode();
}

ただし、逆シリアル化に関しては注意してください。

@VirtualProperty この注釈は、メソッドによって返されるデータがオブジェクトのプロパティのように表示されることを示すために、メソッドで定義できます。

> 注: これはシリアル化でのみ機能し、逆シリアル化中は完全に無視されます。

お役に立てれば...

于 2013-04-14T08:39:20.857 に答える
9

これはすでに回答済みですが、@Accessor を使用することもできます。これはおそらく (たぶん、確かではありませんが) デシリアライゼーションでも機能します。

/**
 * @Type("Acme\SearchBundle\Entity\Country")
 * @Groups({"manage"})
 * 
 * @var \Acme\SearchBundle\Entity\Country
 *
 * @Serializer\Accessor(getter="getCountryMinusId",setter="setCountryWithId")
 */
private $country;

/**
 * @return string|null
 */
public function getCountryMinusId()
{
    if (is_array($this->country) && isset($this->country['id'])) {
        return $this->country['id'];
    }

    return null;
}

/**
 * @param string $country
 * @return $this
 */
public function setCountryWithId($country)
{
    if (!is_array($this->country)) {
        $this->country = array();
    )

    $this->country['id'] = $country;

    return $this;
}
于 2014-02-16T01:52:00.160 に答える
9

@Typeおよび@Accessor注釈を使用できます 。

/**
 * @Type("string") 
 * @Accessor(getter="serializeType",setter="setType") 
 */
protected $type;
public function serializeType()
{   
  return $this->type->getId();
}
于 2015-12-17T14:44:08.327 に答える
1

作成者は、受け入れられた回答には適用されないプロパティ名を保持したいと考えています。私が理解している限り、ScayTrase による回答は元のプロパティ名を保持しますが、コメントによると別の欠点があります。 Doctrine ORM を使用している場合、関連するオブジェクトがフェッチされる@ManyToOneため、パフォーマンスが低下します。

元のプロパティ名を保持したい場合は@VirtualProperty、クラス レベルで@Exclude元のプロパティを定義する必要があります。それ以外の場合、シリアル化されたプロパティ名はゲッター メソッドから派生します (countryIdこの場合)。

/**
 * @Serializer\VirtualProperty(
 *     "country",
 *     exp="object.getCountryId()",
 *     options={@Serializer\SerializedName("country")}
 * )
 */
class Ad {
    /**
     * @Serializer\Exclude
     */
    private $country;

    public function getCountryId() {
        return $this->country === null ? null : $this->country->getId();
    }
}
于 2017-10-06T08:23:25.643 に答える