2

私は一晩中これについて頭を悩ませてきたようです。ドキュメント クエリの結果をシリアル化しようとするたびに、bool(false)の結果が返されます。おそらく、これはシリアル化が失敗していることを意味します (すばらしい! 失敗した理由を喜んで教えてくれるでしょうか? いいえ? そうは思いませんでした。 )

マッピングが保持されているJMSSerializerBundle場所を伝えました。例:FOSUserBundle

jms_serializer:
    metadata:
        file_cache:
            dir: "%kernel.cache_dir%/serializer"
        auto_detection: true
        directories:
            FOSUserBundle:
                namespace_prefix: "FOS\\UserBundle"
                path: "%kernel.root_dir%/config/serializer/fosuser"

Model.User.xmlなどの非常に単純な XML シリアライザー メタデータ ファイルを定義しました。

<?xml version="1.0" encoding="UTF-8" ?>
<serializer>
    <class name="FOS\UserBundle\Model\User" xml-root-name="user" exclusion-policy="all">
        <property name="username" type="string" expose="true" />
    </class>
</serializer>

そして、テストコントローラーでは、より洗練された何かをしようとする前にシリアライザーを手動で呼び出しています。

class DefaultController extends Controller
{
    public function serializeAction()
    {
        $userManager = // get the user manager
        $users = $userManager->findUsers();         
        $serializer = $this->get('jms_serializer');
        foreach ($users as $id => $user) {
            Debug::dump('Processing user: '.$user->getUsername());
            $result = $serializer->serialize($user, 'json');
            Debug::dump($result);
        }
        /*return a response */
    }
}

結果?常にbool(false)

Userただし、新しいオブジェクトを手動で作成すると、シリアル化は正常に機能します。たとえば、次のようになります。

class DefaultController extends Controller
{
    public function serializeAction()
    {
        $userManager = // get the user manager
        $users = $userManager->findUsers();         
        $serializer = $this->get('jms_serializer');

        $user = new User();
        $user->setUsername('testusername');
        Debug::dump('Processing user: '.$user->getUsername());
        $result = $serializer->serialize($user, 'json');
        Debug::dump($result);
        /*return a response */
    }
}

何かご意見は?私はこれについて私の心を失う準備ができています。

編集:また、さらに検討すると、シリアライゼーション メタデータが尊重されているようには見えないことに注意してください。上記のように、私はユーザー名のみを公開していますがUser、コントローラーで新しいものを作成してシリアル化すると、公開されているだけでなくusernameenabledlockedexpiredroles、およびcredentials_expired. null 以外のデータが含まれている場合、すべてのフィールドが表示されると思います。

編集 (2): ;DoctrineObjectConstructorのデフォルトのオブジェクトコンストラクターを使用することへの参照を見てきました。私の問題を解決できることを期待して、この回答serializerで特定された手順を実行しました。悲しいかな、彼らはそうしませんでした(その答えと質問は、とにかく逆シリアル化のためのものだったようです)、bool(false)の結果は持続します。

編集 (3):シリアライゼーション メタデータが取得されなかった問題は、私が尋ねた別の質問: JMSSerializerBundle mix auto detection and explicit directory?auto_detectionに示されているように、と の明示的な宣言が混在しているためのようです。directories

4

0 に答える 0