2

XML を返す API を使用しています。API を使用して 1 つまたは複数のアカウントを取得できます。Jms シリアライザーを使用して、このデータをデータを保持する単純なモデル クラスに逆シリアル化しています。

アカウントは次のようになります

<account href="https://your-subdomain.recurly.com/v2/accounts/1">
  ...
  <account_code>1</account_code>
  <state>active</state>
  <username nil="nil"></username>
  <email>verena@example.com</email>
  <first_name>Verena</first_name>
  <last_name>Example</last_name>
  ...
  <address>...</address>
</account>

次のようにオブジェクトを構成することができました。これはAccount、逆シリアル化時に正常に機能します。

<?php
namespace Recurly\Model;
use JMS\Serializer\Annotation as JMS;

/**
* @JMS\XmlRoot("account")
*/
class Account
{
    /** @JMS\Type("string") */
    protected $account_code;
    /**  @JMS\Type("string") */
    protected $state;
    /** @JMS\Type("string") */
    protected $username;
    /** @JMS\Type("string") */
    protected $email;
    /** @JMS\Type("string") */
    protected $first_name;
    /** @JMS\Type("string") */
    protected $last_name;
    /** @JMS\Type("string") */
    protected $company_name;
    /** @JMS\Type("string") */
    protected $vat_number;
    /** @JMS\Type("Model\Address") */
    protected $address;
    /** @JMS\Type("string") */
    protected $accept_language;
    /** @JMS\Type("string") */
    protected $hosted_login_token;
    /** @JMS\Type("DateTime") */
    protected $created_at;

    // getters and setters here
}

複数のアカウントを取得すると、次のようになります。

<accounts type="array">
  <account href="https://your-subdomain.recurly.com/v2/accounts/1">...</account>
  <account href="https://your-subdomain.recurly.com/v2/accounts/2">...</account>
  <account href="https://your-subdomain.recurly.com/v2/accounts/3">...</account>
</accounts>

これを一連のアカウントに逆シリアル化したいと思います。ただし、現時点では、トリックを実行する唯一の方法は、Accounts次のような 2 番目のモデルを作成することです。

<?php
namespace Recurly\Model;
use JMS\Serializer\Annotation as JMS;

class Accounts 
{
    /**
     * @var Account[]
     *
     * @JMS\Type("array<Recurly\Model\Account>")
     * @JMS\XmlList(entry="account")
     */
    protected $accounts;

    // getters and setters here
}

逆シリアル化するときは、正しいコンテキストを渡す必要があります。

$serializer->deserialize($rawXml, 'Recurly\Model\Account', 'xml'); // or Recurly\Model\Accounts if I get multiple.

SOの質問またはJMSシリアライザーGithubのどこかで、「タイプ」をコンテキストとして渡すこともできることを見つけました$serializer->deserialize($rawXml, 'array<Recurly\Model\Account>', 'xml')が、これは単に空の配列になります...追加なしで配列を逆シリアル化できるかどうかは誰でも知っていますデータ・モデル?

4

1 に答える 1

1

$serializer->deserialize($rawXml, 'array', 'xml') は、xml 構造を調整することで使用できます (result と entry は既定値です)。逆シリアル化には 4 番目のパラメーターがあります - $context はデフォルト値を再定義できますが、その方法がわかりません。

<result>
    <entry>
        <account_code>1</account_code>
        <state>active</state>
        <username nil="nil"></username>
        <email>verena@exampl.com</email>
        <first_name>Verena</first_name>
        <last_name>Example</last_name>
    </entry>
    <entry>
        <account_code>1</account_code>
        <state>active</state>
        <username nil="nil"></username>
        <email>verena@exampl.com</email>
        <first_name>Verena</first_name>
        <last_name>Example</last_name>
    </entry>
</result>
于 2013-12-17T14:17:20.780 に答える