0

XMLファイルのデシリアライズに取り組んでいます。それは私が代わりに\DateTimeオブジェクトのnullオブジェクトに、次のXML要素(OfferDate)をデシリアライズしようとしているので、いくつかの要素がどのようなデータが含まれないことがあります:JMSSerializer:空のDateTime XML要素をPHP "null"オブジェクトにデシリアライズ

<Product> 
    <OfferDate></OfferDate> 
</Product> 

...しかし、私は取得しています次のエラー:

JMS\Serializer\Exception\RuntimeException: Invalid datetime "", expected format Y-m-d\TH:i:s. 

./vendor/jms/serializer/src/JMS/Serializer/Handler/DateHandler.php:117 
./vendor/jms/serializer/src/JMS/Serializer/Handler/DateHandler.php:99 
./vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php:180 
./vendor/jms/serializer/src/JMS/Serializer/XmlDeserializationVisitor.php:280 
./vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php:236 
./vendor/jms/serializer/src/JMS/Serializer/XmlDeserializationVisitor.php:175 
./vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php:130 
./vendor/jms/serializer/src/JMS/Serializer/XmlDeserializationVisitor.php:251 
./vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php:236 
./vendor/jms/serializer/src/JMS/Serializer/Serializer.php:182 
./vendor/jms/serializer/src/JMS/Serializer/Serializer.php:116 
./vendor/phpoption/phpoption/src/PhpOption/Some.php:89 
./vendor/jms/serializer/src/JMS/Serializer/Serializer.php:119 
./tests/AppBundle/Domain/Model/ProductTest.php:35 
./tests/AppBundle/Domain/Model/ProductTest.php:44 

いくつかのデータがあるので、XMLファイルは、それが働くだろうOfferDate2016-09-25T18:58:55のために含まれます場合は...しかし、それは私が持っているすべてのデータのない要素があり得ることも可能ですので、この場合も同様です。で上見られるように

$xml = file_get_contents(__DIR__.'/product.xml'); 

$serializer = SerializerBuilder::create() 
           ->addMetadataDir(__DIR__.'/../../../../app/config/serializer') 
           ->build(); 

/** @var ProductCollection $productCollection */ 
$productCollection = $serializer->deserialize($xml, ProductCollection::class, 'xml'); 
$firstProduct = $productCollection->getProducts()[0]; 

var_dump($firstProduct->getOfferDate()); 

./tests/AppBundle/Domain/Model/ProductTest.php:35

AppBundle\Domain\Model\Product: 
    xml_root_name: Product 
    properties: 
    offerDate: 
     serialized_name: OfferDate 
     type: DateTime<'Y-m-d\TH:i:s'> 

マイProductクラス:

そして最後に、私の直列化復元オブジェクトにXMLをデシリアライズする

マイYMLマッピングエラーは、$productCollection = $serializer->deserialize($xml, ProductCollection::class, 'xml');の行に相当します。 nullオブジェクトに任意のデータなし

To clarify why I deserialize into a ProductCollection : The product.xml contains a <Products> element in which <Product> elements are. The ProductCollection then contains a method called getProducts() which returns an array containing the deserialized Product objects.

OfferDate要素をデシリアライズする方法はあり

、?そしてもしそうなら、どうですか?

答えて

0

私は、DateTimeオブジェクトの逆シリアル化プロセスのためにHandlerを作成することを考え出しました。

私の解決策です。

<?php 
declare(strict_types = 1); 

namespace AppBundle\Serializer\Handler; 

use JMS\Serializer\Handler\DateHandler; 
use JMS\Serializer\XmlDeserializationVisitor; 

/** 
* @author ... 
*/ 
class DateTimeHandler extends DateHandler 
{ 
    /** 
    * @param XmlDeserializationVisitor $visitor 
    * @param $data 
    * @param array $type 
    * 
    * @return \DateTime|null 
    */ 
    public function deserializeDateTimeFromXml(XmlDeserializationVisitor $visitor, $data, array $type) 
    { 
     // Casting the data to a string will return the value of the 
     // current xml element. So if it's empty there is no data. 
     if ((string)$data === '') { 
      return null; 
     } 

     return parent::deserializeDateTimeFromXml($visitor, $data, $type); 
    } 
} 

をその後、私の直列化復元に:私のDateTimeHandlerはJMSSerializerによって提供されるデフォルトDateHandlerのクラスやメソッドをオーバーライドdeserializeDateTimeFromXmlconfigureHandlers方法を気づか)

$xml = file_get_contents(__DIR__.'/product.xml'); 

$serializer = SerializerBuilder::create() 
           ->addMetadataDir(__DIR__.'/../../../../app/config/serializer') 
           ->configureHandlers(
            function (HandlerRegistry $registry) { 
             $registry->registerSubscribingHandler(new DateTimeHandler()); 
            } 
           ) 
           ->build(); 

/** @var ProductCollection $productCollection */ 
$productCollection = $serializer->deserialize($xml, ProductCollection::class, 'xml'); 

これは今完全に正常に動作します!

関連する問題