如何在Symfony 2.0 Ajax应用程序中将理论实体编码为JSON?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我正在开发游戏应用程序并使用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;
用户回答回答于

现在使用php5.4,可以这样做:

use JsonSerializable;

/**
* @Entity(repositoryClass="App\Entity\User")
* @Table(name="user")
*/
class MyUserEntity implements JsonSerializable
{
    /** @Column(length=50) */
    private $name;

    /** @Column(length=50) */
    private $login;

    public function jsonSerialize()
    {
        return array(
            'name' => $this->name,
            'login'=> $this->login,
        );
    }
}

然后调用

json_encode(MyUserEntity);

扫码关注云+社区