2017-01-30 26 views
1

從我控制我傳遞一個陣列實體Tag到樹枝文件是這樣的:嫩枝json_encode與實體對象和集合(Symfony3)

return $this->render('tags/list.html.twig', array(
    'tags' => $tags, 
)); 

然後,我顯示HTML與枝條每個標籤for。每個Tag都有一個實體Texts(以多種語言)的集合。我想將文本集合傳遞給JS來使用jQuery進行一些處理。

{% for tag in tags %} 
    {% if tag.texts|default %} 
     <div data-tag-texts="{{ tag.texts|json_encode }}">...</div> 
    {% endif %} 

    ... 
{% endfor %} 

但在JS返回一個空對象:Object {}而我收藏的文本不爲空。通常,文本是對象的對象。

我嘗試了很多東西,但結果相同:

{{ tag.texts|json_encode }} 
{{ tag.texts|json_encode(constant('JSON_PRETTY_PRINT'))|raw }} 

我想瀏覽文本,以顯示在語言選項卡每個人。所有這些都在Boostrap Modal中。所以,我必須在JavaScript中獲取文本。

感謝您的幫助。

+2

您可以實現[\ JsonSerializable](http://php.net/manual/en/class.jsonserializable.php)接口到您的對象或使用[JMSSerializerBundle](https://github.com/schmittjoh/JMSSerializerBundle) – Matteo

+0

我想測試[Symfony串行器組件](http://symfony.com/doc/current/components/serializer.html) – Felurian

+0

hi @Felurian很好的選擇! – Matteo

回答

1

感謝@Matteo的構想,我安裝了Symfony的Serializer Component(而不是實現\ JsonSerializable接口)。

在我Tag實體,我說:

use Symfony\Component\Serializer\Serializer; 
use Symfony\Component\Serializer\Encoder\JsonEncoder; 
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; 

public function serializer() { 
    $encoder = new JsonEncoder(); 

    $normalizer = new ObjectNormalizer(); 
    $normalizer->setIgnoredAttributes(array(
     'typeCode', 'type', 'range', 
     'useCaseCode', 'useCase', 'updatedAt', 'updatedBy')); 

    $normalizer->setCircularReferenceHandler(function ($object) { 
     return $object->getName(); 
    }); 

    $serializer = new Serializer(array($normalizer), array($encoder)); 
    return $serializer->serialize($this, 'json'); 
} 

這是非常有用的,因爲我們可以選擇屬性,我們有實體間關係。

在我的嫩枝文件:

<div data-tag="{{ tag.serializer }}">...</div> 

在JS,我有我的標籤對象。文本是對象數組。一切都很好!

注意:小心你的Symfony版本。 Mine是3.0.9,我無法安裝Serializer組件。我不得不將Symfony更新到3.2以使其工作。

+0

好的答案@Felurian,使我的工作,在我的樹枝,我通過添加原始過濾器像這樣{{Object.serializer | raw}}禁用默認轉義過濾器。 NB:我的symfony版本是2.6 – chebaby

-1

https://twigfiddle.com/ntexhi

看起來不錯,基本的文本。我認爲你必須有非UTF-8字符,這會破壞你的編碼,並因此返回空JSON。在將數據發送給Twig之前,嘗試使用utf8_encode

+0

我的數據庫已經在utf8mb4_unicode_ci中,但是,我有重音字符...我不想編碼每個標籤的每個文本,這將是一個漫長的過程。 – Felurian

+0

那麼,你試過什麼[@Matteo](http://stackoverflow.com/questions/41933455/twig-json-encode-with-entity-objects-and-collections-symfony3/41933637?noredirect=1#comment71047469_41933455)建議? –

+0

是的,我現在正在測試[Symfony序列化組件](http:// symfony。com/doc/current/components/serializer.html) – Felurian