2011-08-10 17 views
6

Estoy usando Symfony 2 con Doctrine 2 para crear un servicio web (JSON) para una aplicación de iOS.Symfony 2 Exportación de Doctrine a JSON

a buscar a mi entidad hago:

$articles = $this->getDoctrine()->getRepository('UdoPaddujourBundle:MenuArticle')->findAll(); 

debo decir que:

$article = array(); 
$article = $articles->toArray(); 

me da el siguiente error:

Fatal error: Call to a member function toArray() on a non-object 

Lo mismo happends con

$article = $articles->exportTo('json'); 

¿Cómo puedo crear una respuesta json?

Saludos cordiales, Cearnau Dan

Editar: var_dump artículos ($) =

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]=> ... 

- de editar posteriormente

¿Cómo puedo recorrer todos los "nombres de propiedad"? Esto es lo que tengo:

$myarray=array(); 
$myArray["name"]=array(); 
$myArray["description"]=array(); 
foreach($articles in $article) 
{ 
    array_push($myArray["name"], $article->getName()); 
    array_push($myArray["description"], $article->getDescription()); 
} 
+0

Lo que da 'var_dump ($ artículos);'? – hakre

+0

array (18) { [0] => objeto (Udo \ PaddujourBundle \ Entidad \ MenuArticle) # 50 (4) { [ "id": "Udo \ PaddujourBundle \ Entidad \ MenuArticle": private] => int (1) ["nombre": "Udo \ PaddujourBundle \ Entity \ MenuArticle": privado] => cadena (17) "Mi nombre de artículo 1" ["description": "Udo \ PaddujourBundle \ Entity \ MenuArticle" : private] => string (24) "Mi artículo Descripción 1" [ "precio": "Udo \ PaddujourBundle \ Entidad \ MenuArticle": private] => flotador (20) } [1] => ** Y así sucesivamente hasta [17] ** –

+0

¿Qué le da 'json_encode ($ articles);'? – hakre

Respuesta

3

Si usted viene de un fondo de Symfony 1.x, había mucho más "mágica" disponible para las entidades, incluyendo ayudantes para convertir a las matrices, etc. .

En Symfony2, la mayor parte de la magia se ha ido; las entidades en particular ahora son simples objetos PHP antiguos que Doctrine 2 administra para la persistencia en la base de datos, lo que significa que para tener métodos como toArray() disponibles en su objeto de dominio, debe implementarlos usted mismo. Debería ser bastante trivial: simplemente devuelva una matriz de clave-valor con ("name of property" => "value of property") ... si tiene relaciones establecidas con otras entidades, necesitará implementar un método toArray() en esas también, y simplemente llame desde la entidad principal cuando estás convirtiendo.

Luego, una vez que tenga su matriz de objetos, $json = json_encode($array); le dará una cadena JSON para enviar como respuesta.

+1

¿Cómo puedo recorrer toda la "propiedad"? nombres "? el mejor código es este '$ myarray = array(); $ myArray ["name"] = array(); $ myArray ["description"] = array(); foreach ($ artículos en $ artículo) {array_push ($ myArray ["nombre"], $ artículo-> getName()); array_push ($ myArray ["description"], $ article-> getDescription()); } ' –

14

Si se utiliza una consulta doctrina también se puede hacer esto:

$em = $this->getDoctrine()->getEntityManager(); 
    $query = $em->createQuery('SELECT ma FROM UdoPaddujourBundle:MenuArticle ma ...etc'); 
    $myArray = $query->getArrayResult(); 

y luego json_encode ($ miMatriz); Ver here para más detalles

+1

Gracias funciona, pero es bastante desagradable en comparación con el método" GetRepository() ". Pero si esta es la única manera fácil de obtener una respuesta JSON tengo que lidiar con ella. –

+1

Podrías mover el método a un repositorio personalizado y luego no tendrás que mirarlo ;-) – codecowboy

+0

O echa un vistazo a esto: http://stackoverflow.com/questions/6706485/how-to-encode- doctrine-entities-to-json-in-symfony-2-0-ajax-application – codecowboy

0

Se puede utilizar cuando json_encode($articles) entidad (o cualquier otro objeto) implementa JsonSerializable:

<?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(), 
     ]; 
    } 
} 
Cuestiones relacionadas