symfony - возвращает JSON из вызова однорангового метода в действии - PullRequest
4 голосов
/ 24 марта 2011

У меня есть некоторый код, который проверяет параметр и вызывает метод peer, чтобы получить элементы из БД.

Мне нужно получить эти элементы в JSON.

Мой коллегаметод подобен:

public static function searchFromRequest($word)
{
    $c = new Criteria();
    $c->addJoin(self::ARTICLE_ID, ArticlePeer::ID);
    $c->add(self::TITLE, '%'.$word.'%', Criteria::LIKE);
    $c->addAnd(self::ARTICLE_ID, null, Criteria::ISNOTNULL);
    $c->addAscendingOrderByColumn(self::TITLE);
    return self::doSelect($c);
}

, и мое действие:

public function executeSearch()
{
    $this->word = $this->getRequestParameter('word');
    $this->content_type = $this->getRequestParameter('content_type');
    if($this->content_type == 'article')
    {
        $words = ItemPeer::searchFromRequest($this->word);
    }
    else
    { 
       echo "Nothing here";
    }

Я могу var_dump($words), и я получаю массив (коллекцию) предметов.Проблема в том, как мне вернуть все элементы в JSON?

Я пытался использовать:

        $this->getResponse()->setHttpHeader('Content-type', 'application/json');
        $words = ItemPeer::searchFromArticleRequest($this->word);
        return $this->renderText(json_encode($words));

Но это просто возвращает множество пустых скобок JSON: [{},{},{},{},{},{},{},{},{},{},{},{},{},{}]

Спасибо

Ответы [ 4 ]

3 голосов
/ 10 февраля 2012

Propel 1.6:

  • object-> toJSON ();
  • collection-> exportTo ('JSON');
3 голосов
/ 24 марта 2011

Кажется, что json_encode() не нравится способ создания объектов Propel.

Другим решением может быть принуждение Propel к возврату в базовые ассоциативные объекты, используя XXXPeer::doSelectStmt()

public static function searchFromRequest($word, $returnPropelObjects = true)
{
    $c = new Criteria();
    $c->addJoin(self::ARTICLE_ID, ArticlePeer::ID);
    $c->add(self::TITLE, '%'.$word.'%', Criteria::LIKE);
    $c->addAnd(self::ARTICLE_ID, null, Criteria::ISNOTNULL);
    $c->addAscendingOrderByColumn(self::TITLE);

    if ($returnPropelObjects)
      return self::doSelect($c);

    $stmt = self::doSelectStmt($c);
    $results = array();
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
      $results[] = $row;
    }
    return $results;
}
1 голос
/ 25 марта 2011

Вы также можете вызвать toArray() для ваших объектов.

$words = ItemPeer::searchFromArticleRequest($this->word);
$wordsArray = array();
foreach ($words as $word)
{
    $wordsArray[] = $word->toArray();
}
return $this->renderText(json_encode($wordsArray));

В Propel 1.6 будет toJSON() метод для отдельных объектов или для всей коллекции объектов.

1 голос
/ 24 марта 2011

json_encode / json_decode может кодировать / декодировать только PHP-массивы, а не объекты.Переменная

$words

будет массивом объектов Item, поэтому вывод, который вы написали.

Существует два основных решения.Вы пишете свой собственный кодер json, который работает с объектами, как первый комментарий здесь:

http://php.net/manual/en/function.json-encode.php

или вы пишете функцию, которая преобразует ваши объекты Item в PHP-массивы, как здесь:

http://www.phpro.org/examples/Convert-Object-To-Array-With-PHP.html

...