2

JMSSerializerBundle を使用して、JSON を Doctrine エンティティに取り込もうとしています。データベースにまだ存在しない新しいエンティティを作成し、既存のエンティティが既に存在する場合は更新する必要があります。これを支援するために、JMSSerializer パッケージに含まれるDoctrineObjectConstructorを使用しています。次のような、識別子として指定されたプロパティを含む JSON を使用する場合:

{ "id": 1, "some_other_attribute": "stuff" }

逆シリアル化を試みると、JMSSerializer は警告を発し、リフレクションを利用して null 値のプロパティを設定しようとする例外で最終的に終了します。警告はすべて次のようになります。

PHP Warning: ReflectionProperty::setValue() expects parameter 1 to be object, null given in /Users/cdonadeo/Repos/Ubertester/vendor/jms/serializer/src/JMS/Serializer/GenericDeserializationVisitor.php on line 176

データベースに ID 1 のエンティティを手動で挿入してもう一度試行すると、エラーは発生せず、すべてが正しく機能しているように見えますが、機能の半分が不足しています。DoctrineObjectConstructor クラスのコードを見てみると、一番上にコメントがあります。

/** * Doctrine object constructor for new (or existing) objects during deserialization. */

construct()しかし、関数がすべてのチェックを行った後、最後に呼び出すため、新しいエンティティを作成する方法がわかりません。

$object = $objectManager->find($metadata->name, $identifierList);

また、識別子がデータベースに存在しないため、結果は null になり、最終的に関数から返されます。これは、適切な ID を使用してデータベースに行を挿入すると機能する理由を説明していますfind()。適切な Entity オブジェクトが返されるようになりました。これは、ライブラリの残りの部分が期待するものです。

ライブラリの使い方が間違っていますか、それとも壊れていますか? 私は Git リポジトリをフォークして編集を行いました。試してみると、すべてが多かれ少なかれ期待どおりに機能するようです。その編集にはいくつかの欠点があり、これを必要以上に難しくしているのではないかと思います。私が見る最大の問題は、永続化されたエンティティと永続化されていないエンティティが混在し、どちらがどれであるかを判断する方法がないことですが、それが大したことであるかどうかはわかりません.

4

1 に答える 1