我正在使用Symfony 2与Doctrine 2创建一个iOS应用程序的web服务(JSON)。
获取我的实体i do:
$articles = $this->getDoctrine()->getRepository('UdoPaddujourBundle:MenuArticle')->findAll();
我必须告诉你:
$article = array();
$article = $articles->toArray();
给出以下错误:
Fatal error: Call to a member function toArray() on a non-object
也是一样$article = $articles->exportTo('json');
如何创建json响应
亲切的问候,Cearnau丹
编辑:Var_dump ($articles) =
array(18) {
[0]=>
object(Udo'PaddujourBundle'Entity'MenuArticle)#50 (4) {
["id":"Udo'PaddujourBundle'Entity'MenuArticle":private]=>
int(1)
["name":"Udo'PaddujourBundle'Entity'MenuArticle":private]=>
string(17) "My Article Name 1"
["description":"Udo'PaddujourBundle'Entity'MenuArticle":private]=>
string(26) "My Article Description 1"
["price":"Udo'PaddujourBundle'Entity'MenuArticle":private]=>
float(20)
}
[1]=> ...
- LATER EDIT
如何循环通过所有的"属性名称"?这是我得到的:
$myarray=array();
$myArray["name"]=array();
$myArray["description"]=array();
foreach($articles in $article)
{
array_push($myArray["name"], $article->getName());
array_push($myArray["description"], $article->getDescription());
}
如果你使用原则查询,你也可以这样做:
$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery('SELECT ma FROM UdoPaddujourBundle:MenuArticle ma ...etc');
$myArray = $query->getArrayResult();
然后使用json_encode($myArray);
如果你来自symfony。在X背景中,实体有更多的"魔力"可用,包括帮助转换为数组等等。
在Symfony2中,大部分魔法都消失了;实体现在是普通的老式PHP对象,碰巧由Doctrine 2管理,用于数据库的持久化,这意味着要在域对象上使用toArray()
之类的方法,您必须自己实现它们。这应该是相当微不足道的-简单地返回一个键值数组与("name of property" => "value of property")
…如果你与其他实体建立了关系,你也需要在这些实体上实现一个toArray()
方法,并且在你转换的时候简单地从主实体调用它。
然后,一旦你有了你的对象数组,$json = json_encode($array);
将给你一个JSON字符串作为你的响应发送。
当您的实体(或任何其他对象)实现JsonSerializable
时,您可以使用json_encode($articles)
:
<?php
namespace My'AppBundle'Entity;
use JsonSerializable;
class Channel implements JsonSerializable
{
/*
* All your fields, getters and setters.
*/
/**
* Returns serializable items.
*
* @return array
*/
public function jsonSerialize()
{
return [
'name' => $this->getName(),
'description' => $this->getDescription(),
];
}
}