Symfony ist, Wie zu generieren der Asset-URL in einem Zweig, der Extension Klasse?
Ich habe eine Klasse die sich \Twig_Extension
wie unten :
class MYTwigExtension extends \Twig_Extension
{
protected $doctrine;
protected $router;
public function __construct(RegistryInterface $doctrine , $router)
{
$this->doctrine = $doctrine;
$this->router = $router;
}
public function auth_links($user , $request)
{
//Some other codes here ...
//HOW TO GENERATE $iconlink which is like '/path/to/an/image'
$html .= "<img src=\"$iconlink\" alt=\"\" /> ";
echo $html;
}
}
Meine Frage ist: Wie generieren Asset-links in einem Twig-Erweiterung ? Ich möchte einen Ersatz für das ASSET-Helfer in meiner Klasse. Bassically ich habe keine Ahnung, was ich Spritzen muß, oder verwenden Sie hier ! Vielen Dank im Voraus.
<img src="{{ asset('img/icons/modules/timesheet.png') }}" alt="" />
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die templating.Helfer.Vermögenswerte service direkt.
und verwenden Sie es wie so:
Injektion nur die templating.Helfer.Vermögenswerte direkt funktioniert nicht in diesem Fall, weil die twig Erweiterung nicht in der request-scope. Sehen Sie die Dokumentation hier: https://symfony.com/doc/2.3/cookbook/service_container/scopes.html#using-a-service-from-a-narrower-scope
scope: request
zu Ihrem service-definition. Alternativ können Sie Spritzen den Behälter selbst und den Aufruf $this->container->get('Template.Helfer.assets") sollte auch funktionieren.Ich wollte nicht befassen sich mit der Dependency Injection Container. Dies ist, was ich getan habe:
Habe ich mir angeschaut
Twig_Extension
Klasse code, und fand dieseinitRuntime
Methode es, werden überschrieben, die in unsere benutzerdefinierte Erweiterung Klasse. Es erhält dieTwig_Environment
als ein argument! Dieses Objekt hat einengetFunction
Methode, die gibt einenTwig_Function
Instanz. Wir müssen nur übergeben Sie den Namen der Funktion (asset
in unserem Fall).Den
Twig_Function
Objekt hat einengetCallable
Methode, so dass wir schließlich kann ein callableasset
Funktion.Bin ich wieder ein bisschen weiter die Schaffung einer
asset
Methode für meine eigene extension-Klasse. Überall sonst auf der es, kann ich einfach anrufen$this->asset()
und erhalten das gleiche Ergebnis wie{{ asset() }}
in den Vorlagen.BEARBEITEN: Die
getFunction
Anruf beiinitRuntime
wirft ein Umfang-Ausnahme, wenn Sie den cache leeren. Also zog ich es, um die benutzerdefinierteasset
Methode. Es funktioniert einwandfrei.Twig_Extension_InitRuntimeInterface
oder Umbildung der code mit der Injektion derTwig_Environment
: twig.sensiolabs.org/doc/advanced.html#environment-aware-filtersHier ist eine einfache und saubere Art und Weise für Symfony 2.8:
Dienstleistungen.yml:
In der TWIG-Erweiterung:
Dann können Sie es in eine beliebige Funktion der Erweiterung wie diese:
In Symfony 2.8, das funktioniert für mich:
AppTwigExtension Klasse: