Symfony 2 doctrine export to JSON

J'utilise Symfony 2 avec Doctrine 2 pour créer un service web(JSON) pour une application iOS.

Pour aller chercher de l'entité, je fais:

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

je dois vous dire que:

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

me donne l'erreur suivante:

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

C'est la même chose avec

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

comment créer une réponse json ?

genre Égard, Cearnau Dan

Edit: var_dump ($articles) =

array(18) {
   [0]=>
     object(UdoPaddujourBundleEntityMenuArticle)#50 (4) {
    ["id":"UdoPaddujourBundleEntityMenuArticle":private]=>
    int(1)
    ["name":"UdoPaddujourBundleEntityMenuArticle":private]=>
    string(17) "My Article Name 1"
    ["description":"UdoPaddujourBundleEntityMenuArticle":private]=>
    string(26) "My Article Description 1"
    ["price":"UdoPaddujourBundleEntityMenuArticle":private]=>
    float(20)
    }
   [1]=> ...

- MODIFIER PLUS TARD

Comment passer en boucle tous les" noms de propriétés"? Voici ce que j'ai:

$myarray=array(); 
$myArray["name"]=array(); 
$myArray["description"]=array(); 
foreach($articles in $article) 
{ 
  array_push($myArray["name"], $article->getName());
  array_push($myArray["description"], $article->getDescription()); 
}
6
demandé sur Dan Cearnau 2011-08-10 19:17:19

3 réponses

si vous utilisez une requête de doctrine vous pouvez aussi faire ceci:

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

puis json_encode ($myArray); voir ici pour plus de détails

14
répondu codecowboy 2011-08-11 11:39:42

si vous venez d'un symfony 1.x background, il y avait beaucoup plus de "magie" disponible pour les entités, y compris les helpers pour convertir en tableaux et ainsi de suite.

dans Symfony2, la plupart de la magie a disparu; les entités en particulier sont maintenant de vieux objets PHP simples qui se trouvent être gérés par Doctrine 2 pour persistance à la base de données, ce qui signifie que pour avoir des méthodes telles que toArray() disponibles sur votre objet de domaine, vous devez les mettre en œuvre vous-même. Il devrait être assez trivial à faire -- il suffit de retourner un tableau de valeurs clés avec ("name of property" => "value of property") ... si vous avez des relations mises en place avec d'autres entités, vous aurez besoin d'implémenter une méthode toArray() sur ceux aussi, et appelez simplement cela de l'entité principale quand vous convertissez.

ensuite, une fois que vous avez votre tableau d'objets, $json = json_encode($array); vous donnera une chaîne JSON à envoyer comme réponse.

3
répondu Problematic 2011-08-10 16:21:17

vous pouvez utiliser json_encode($articles) lorsque votre entité (ou tout autre objet) implémente 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(),
        ];
    }
}
0
répondu Aistis 2016-08-05 14:04:51