Symfony 2 Doctrine экспортирует в JSON - PullRequest
6 голосов
/ 10 августа 2011

Я использую Symfony 2 с Doctrine 2 для создания веб-службы (JSON) для приложения iOS.

Чтобы получить свою сущность, я делаю:

$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 Dan

Редактировать: var_dump ($ статьи) =

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

- ПОЗДНЕЕ РЕДАКТИРОВАНИЕ

Как я могу пройти через все«имена свойств»?Вот что у меня есть:

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

Ответы [ 3 ]

14 голосов
/ 11 августа 2011

Если вы используете запрос доктрины, вы также можете сделать это:

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

и затем json_encode ($ myArray); См. здесь для получения более подробной информации

3 голосов
/ 10 августа 2011

Если вы работаете с фоном Symfony 1.x, для сущностей было гораздо больше «магии», включая помощников для преобразования в массивы и т. Д.

В Symfony2 большая часть магии исчезла; в частности, сущности теперь являются простыми старыми объектами PHP, которые управляются Doctrine 2 для сохранения в базе данных, что означает, что для того, чтобы такие методы, как toArray(), были доступны для вашего доменного объекта, вы должны реализовать их самостоятельно. Это должно быть довольно тривиально - просто вернуть массив ключ-значение с ("name of property" => "value of property") ... если у вас есть отношения, настроенные с другими сущностями, вам нужно реализовать метод toArray() и для них, и просто вызовите это из основного объекта, когда вы конвертируете.

Затем, когда у вас есть массив объектов, $json = json_encode($array); выдаст вам строку JSON для отправки в качестве ответа.

0 голосов
/ 05 августа 2016

Вы можете использовать json_encode($articles), когда ваша сущность (или любой другой объект) реализует 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(),
        ];
    }
}
...