1. ホーム
  2. ajax

[解決済み] Symfony 2.0 AJAX アプリケーションで Doctrine のエンティティを JSON にエンコードするには?

2023-02-06 13:31:02

質問

Symfony 2.0を使用してゲームアプリを開発しています。私はバックエンドに多くのAJAXリクエストを持っています。そして、より多くの応答は、エンティティをJSONに変換しています。例えば

class DefaultController extends Controller
{           
    public function launchAction()
    {   
        $user = $this->getDoctrine()
                     ->getRepository('UserBundle:User')                
                     ->find($id);

        // encode user to json format
        $userDataAsJson = $this->encodeUserDataToJson($user);
        return array(
            'userDataAsJson' => $userDataAsJson
        );            
    }

    private function encodeUserDataToJson(User $user)
    {
        $userData = array(
            'id' => $user->getId(),
            'profile' => array(
                'nickname' => $user->getProfile()->getNickname()
            )
        );

        $jsonEncoder = new JsonEncoder();        
        return $jsonEncoder->encode($userData, $format = 'json');
    }
}

そして、私のすべてのコントローラは、エンティティを取得し、そのフィールドのいくつかをJSONにエンコードするという同じことをします。ノーマライザーを使用して、すべてのエンティティをエンコードできることは知っています。しかし、あるエンティティが他のエンティティに循環するリンクを持っている場合はどうでしょうか?またはエンティティグラフが非常に大きい場合はどうなりますか?あなたは何か提案を持っていますか?

私は、エンティティのためのいくつかのエンコーディングスキーマについて考えています...または使用する NormalizableInterface を使って循環を避けるとか..,

どのように解決するのですか?

別の方法として JMSSerializerBundle . そして、コントローラで次のようにします。

$serializer = $this->container->get('serializer');
$reports = $serializer->serialize($doctrineobject, 'json');
return new Response($reports); // should be $reports as $doctrineobject is not serialized

エンティティクラスでアノテーションを使用することで、シリアライズがどのように行われるかを設定することができます。上のリンクにあるドキュメントを参照してください。例えば、リンクされたエンティティを除外する方法は以下の通りです。

 /**
* Iddp\RorBundle\Entity\Report
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Iddp\RorBundle\Entity\ReportRepository")
* @ExclusionPolicy("None")
*/
....
/**
* @ORM\ManyToOne(targetEntity="Client", inversedBy="reports")
* @ORM\JoinColumn(name="client_id", referencedColumnName="id")
* @Exclude
*/
protected $client;