如何在Twig循环中迭代许多属性?

时间:2019-11-04 09:40:14

标签: php symfony twig

我(可能)在Twig中的属性存在问题。我在Symfony中有控制器,其中(来自Doctrine的) getCategories() getWords() getTranslations()方法返回对象(关系)。控制器中的每个属性都是一个数组,因为我调用了返回数组的 findAll()方法(再次从Doctrine中调用)。最后,我将控制器的所有属性返回到视图(Twig文件),在这里尝试显示Twig for loop的结果。

问题是Twig循环仅对 flashcards 属性进行迭代(我知道为什么;)),而我不知道如何进行多属性迭代。我希望循环遍历控制器返回的所有属性。

在controller foreach循环中,我尝试使用新的关联键更新 flashcards 数组,例如: category word translation ,以便将Doctrine返回的所有结果(包括关系)存储在一个 flashcards 属性中,但是Symfony会引发异常。

我想知道是否在控制器中创建一个数组,以便将抽认卡类别 word translation < / em>数组,然后将此一个数组返回到视图,但是我认为这不是好习惯。

这是控制器方法代码:

public function showAllCards()
{
    $flashcards = $this->getDoctrine()->getRepository(Flashcards::class)
        ->findAll();

     foreach ($flashcards as $flashcard) {
        $category = $flashcard->getCategories()->getName();
        $word = $flashcard->getWords()->getWord();
        $translation = $flashcard->getTranslations()->getWord();
    }

      return $this->render('try_me/index.html.twig', [
        'flashcards' => $flashcards,
        'category' => $category,
        'word' => $word,
        'translation' => $translation
    ]);
}

这是Twig循环代码:

{% for flashcard in flashcards %}

  {{ word }}
  <br>
  {{ flashcard.pronunciation }}
  <br>
  {{ flashcard.exampleSentence }}
  <br>
  {{ category }}
  <br>
  {{ translation }}
  <br>

{% endfor %}

我试图执行以下控制器代码...

public function showMeAll()
{
    $flashcards = $this->getDoctrine()->getRepository(Flashcards::class)
        ->findAll();

     foreach ($flashcards as $flashcard) {
        $flashcards['categories'] = $flashcard->getCategories()->getName();
        $flashcards['words'] = $flashcard->getWords()->getWord();
        $flashcards['translations'] = $flashcard->getTranslations()->getWord();
    }

      return $this->render('try_me/index.html.twig', [
        'flashcards' => $flashcards,
    ]);
}

...具有以下Twig循环...

{% for flashcard in flashcards %}

  {{ flashcard.words }}
  <br>
  {{ flashcard.pronunciation }}
  <br>
  {{ flashcard.exampleSentence }}
  <br>
  {{ flashcard.categories }}
  <br>
  {{ flashcard.translations }}
  <br>

{% endfor %}

...但是随后Symfony说:

在呈现模板期间引发了异常(“可捕获的致命错误:Proxies__CG __ \ App \ Entity \ Words类的对象无法转换为字符串”)。

能给我一些解决这个问题的技巧吗?我希望Twig循环可迭代许多属性(闪存卡单词类别翻译)。或写下是否有更好的解决方案。

在此先感谢您的回答!

1 个答案:

答案 0 :(得分:0)

根据您的代码段,我猜您需要以下内容:

{% for flashcard in flashcards %}
    {% for word in flashcard.getWords() %}
        {{ word }}<br />
    {% endfor %}
    {{ flashcard.getPronunciation() }}<br>
    {{ flashcard.getExampleSentence() }}<br>
    {% for category in flashcard.getCategories()() %}
         {{ category.getName() }}<br />
    {% endfor %}
    {% for translation in flashcard.getTranslations() %}
         {{ translation.getWord() }}<br />
    {% endfor %}
{% endfor %}

请参阅本文档的section。基本上,如果您拥有foo.bartwig将测试bar是否是foo的公共财产,如果没有,则测试是否存在公共getter,{{ 1}},以获取getBar


两个循环中都有一些旁注,值barcategoryword仅保存translation的最后一个值,因为您正在覆盖该值每次。