Abrufen von Daten aus in einem twig-template in Symfony2?
Möchte ich abrufen von Daten aus einer Datenbank und zeigt es in einer Vorlage. Ich normalerweise tun Sie dies innerhalb der controller und übergeben Sie die Daten als variable, allerdings habe ich Holen wollen andere Mengen von Daten, die mit der gleichen Methode je nachdem, welche Vorlage ist der Aufruf der Methode. Ich habe mir bei der Einbettung Controller aber ich will nur die Daten, nicht die gerenderte HTML - http://symfony.com/doc/2.0/book/templating.html#embedding-controllers
Beispiel
{# views/template1.html.twig #}
{% for item in FetchDBdata('someParam', 20) %}
{{ item.name }}
{{ item.title }}
{% endfor %}
{# views/template2.html.twig #}
{% for item in FetchDBdata('someOtherParam', 40) %}
{{ item.name }}
{{ item.title }}
{% endfor %}
wo FetchDBdata('someParam', 40)
wäre in einer service-Klasse in der app
- Den Blick sollst nicht die direkte Interaktion mit dem Modell.
- Warum kann man nicht einfach ein {% render %}? Sicherlich wird die gerenderte Vorlage wäre nur die snippets, die Sie eingefügt oben abzüglich der
FetchDbData
nennen, weil, die Daten kommen aus dem controller. DiesomeParam
und20
übergeben werden würde, um den controller über das render-tag.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinzufügen zu meinem Kommentar oben:
Müsstest du einen controller mit einer action zum abrufen der Daten:
Acme\SomeBundle\Controller\DataController.php
Acme\SomeBundle\Resources\Ansicht\Daten\fetchData.html-Code.Zweig
dann in Ihre
template1
undtemplate2
Sie können hartcodieren Ihre Werte, falls das passt, oder verwenden Sie die Werte, die übergeben werden, um diese Vorlagen bzw.return array('controller' => $this)
Wenn du wirklich sicher, dass Sie wollen, nennen Sie das Modell, direkt von Ihrer Vorlage haben Sie zwei Möglichkeiten, die ich sehen kann:
Entweder Sie machen den service, den Sie benötigen zur Verfügung, um die Vorlage wie:
was ich denke, dann könnten Sie rufen Methoden auf, die in der Ansicht:
Alternativ, wenn Sie nicht möchten, übergeben Sie den service, um die Vorlage für Sie, um die Daten, die es erfordert, dann kannst du ein twig-Erweiterung, die können Sie nachlesen: hier, hier und hier. (Watch out für diesen letzten link, aber ich denke, es enthält eine Menge unnötige Schritte, so werde ich eine kürzere version.
, Um eine Zweig-Funktion wie FetchDbData:
Zuerst benötigen Sie eine Klasse, die den Aufstieg:
Acme\SomeBundle\Extension\TemplateDataExtension.php
Sollten Sie in der Lage, rufen Sie diese direkt aus einem template mit
FetchDbData($params, $quantity)
.Nun müssen Sie auch registrieren, dies als Erweiterung, welche Sie über die Dienste.yml:
Im wesentlichen mit diesen Schritten haben sollten, dürfen Sie eine Funktion aus zugänglich Zweig (Vorausgesetzt ich hab alles richtig ;)). Man könnte hinzufügen, wie viele Funktionen, die Sie wollen, um die Erweiterung in einer Klasse, um zu verhindern, dass mehrere Erweiterungen jedes mal, wenn Sie brauchen etwas mehr Daten zugänglich auf der Ansicht - ich bin mir nicht wirklich sicher, was ich durchgehen würde, aber, twig-Erweiterung oder der übergabe der Dienstleistung an den view.
Ich hoffe, dies wird Ihnen einige weitere Optionen, die passen könnten, wie Sie sich das design Ihres Template-system :).
Edit: Auch nur eine Notiz zu sagen, ich nehme an, in das Schema der Dinge, die ein Helfer-Objekt (Zweig-Erweiterung, um auf einen service zuzugreifen oder die übergabe eines Dienstes) scheint nicht schlecht, da wirklich der Ansicht ist, im Gespräch wieder auf einen controller zu bekommen, einige Daten so weit wie ich das beurteilen kann. Auch ich denke es kann ein Weg sein, um Zugriff auf die controller die Rede, der Vorlage seiner selbst durch
_controller
die möglicherweise einen anderen Platz zu setzen-Methoden.Eine mögliche Lösung ist die Verwendung Zweig Globale Variablen.
Als ein Beispiel, wenn Sie mit Doctrine2 und Ihre Methode zum abrufen von Daten
findSth
ist umgesetzt in repository -Your\Model
Sie definieren könnte:Und in Ihrer Vorlage