Wstrzyknij Twig do JS za pomocą Assetic (moc .js.twig)
Agencja internetowa » Wiadomości cyfrowe » Wstrzyknij Twig do JS za pomocą Assetic (moc .js.twig)

Wstrzyknij Twig do JS za pomocą Assetic (moc .js.twig)

Po pierwsze, ten artykuł jest krótkim raportem siekać który zrobiłem kilka dni temu.

Nie będąc zdecydowanym zwolennikiemAssetyczny, jest to dla mnie obowiązkowe, aby używać go w projektach, które obecnie rozwijamy w mojej firmie. A zatem korzystanie z Assetyczny musi oddać mi maksimum usług, jak wszystkie narzędzia.

Problem ? Rozwiązanie !

Oto mój problem. Wszyscy mieliśmy potrzebę zbudowania trasy w pliku JS. Na ten problem wszyscy znaleźliśmy pseudorozwiązanie.

  1. Wstrzykujesz do swojej strony (HTML) zmienną JS z treścią Gałązka. Ta zmienna będzie używana w pliku JavaScript ładowanym przez Assetyczny. Skuteczne, ale trudne do odczytania i niezbyt łatwy w obsłudze.
    1
    2
    3
    4
    5
    6
    7
    8
    // szablon gałęzi
    <scenariusz>
    było mojaZmienna = « {{ path(‘my_route’) }}";
    </scenariusz>
    // plik javascript
    $("#sort").on("zmiana", funkcja() {
    window.location.href = mojaVar + $(this).val();
  2. Używasz FOSJsRoutingBundle i korzystasz z katalogu tras w pliku JS generowane przez zapakować. Zaletą jest to, że trasy można generować bardzo łatwo, z parametrami związanymi z kontekstem. Wadą jest użycie a zapakować dodatkowe, oraz obowiązek zgłoszenia drogi do użytku z opcją wyeksponować=prawda. Może to potencjalnie ujawnić niektóre trasy w pliku zawierającym wszystkie ujawnione trasy.
    Czasami użycie Pakiet routingu FOSJs jest trochę jak użycie bazooki do zabicia muchy: dużo kosztuje, gdy nie trzeba wiele robić. Alternatywa, próba wstrzyknięcia Gałązka w jego JS.

W jakim przypadku użycia i jakie są ograniczenia?

Uważaj, to siekać nie powinien być używany za wszelką cenę, ponieważ jego użycie jest bardzo ograniczone.

Assetyczny kompiluje pliki JavaScript w sposób całkowicie oderwany od bieżącego kontekstu. Mam na myśli kontekst przez bieżące żądanie. Jeśli w pliku JS możesz spróbować użyć wszystkiego i wszystkiego, podczas generowania pliku dostępne będą tylko niektóre zmienne.

  • Zmienne globalne Gałązka
  • funkcje i filtry Gałązka może być użyte
  • Trasy są dostępne i mogą być generowane
    KUKURYDZA !! context nie jest dostępny, więc nie spodziewałem się użycia bieżących parametrów żądania za pośrednictwem zmiennych Gałązka W każdym przypadku.

Możesz zatem generować trasy bez parametrów dynamicznych lub z parametrami statycznymi, a nawet używać parametrów globalnych, takich jak te wprowadzone do pliku parametr.yml.

Wszystko o tym, jak to skonfigurować

Musisz utworzyć filtr Gałązka tak, że Assetyczny wiedzieć, co zrobić z plikami. Możesz go umieścić src/AppBundle/Filtr.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
przestrzeń nazw Pakiet aplikacjiFILTRY;
posługiwać się AssetycznykapitałInterfejs zasobów;
posługiwać się AssetycznyFILTRYInterfejs filtra;
posługiwać się SymfonyZapakowaćPakiet TwigTwigEngine;
/ **
* @autor Baptysta Donaux@gmail.com>
*/
klasa GałązkaFiltr narzędzia Interfejs filtra
{
prywatny $szablony;
publiczny funkcjonować __zbudować(szablon TwigEngine $)
{
$ to->szablony = $szablony;
}
publiczny funkcjonować Załaduj filtr(AssetInterface $ zasób)
{}
publiczny funkcjonować zrzut filtra(AssetInterface $ zasób)
{
$zawartość = $zasób->pobierzZawartość();
$zawartość = $ to->template->render($asset->getSourceRoot().„/”.$asset->getSourcePath());
$zasób->ustawZawartość($zawartość);
}
}

Musisz zadeklarować ten filtr. Jest to usługa, którą oznaczymy jako filtrAssetyczny. Możesz to zadeklarować w app/config/services.yml.

1
2
3
4
5
6
7
usługi:
atut.filtr.gałązka:
klasa: Pakiet aplikacjieFilterTwigFilter
argumenty:
- @szablon
tagi:
- { nazwa: „filtr.asset.”, znany jako: "Gałązka" }

W Twoim szablon gdzie chcesz użyć pliku takiego jak .js. gałązka, po prostu zadeklarujesz filtr Assetyczny.

1
2
3
4
5
{% JavaScript filter=”gałązka”
„@AppBundle/Resources/public/js/file.js.twig”
%}
<scenariusz rodzaj=„tekst/javascript” src=« {{ asset_url }}« ></scenariusz>
{% endjavascripts %}

tutaj jest plik plik.js.twig stosowany w moim przypadku.

1
2
3
$(" #zaklęcie ").My("zmiana", funkcjonować() {
okno.lokalizacja.href= "{{ścieżka('moja_trasa', {}) }}" + $(to.val();
});

Po wygenerowaniu pliku tutaj jest renderowanie.

1
2
3
$(" #zaklęcie ").My("zmiana", funkcjonować() {
okno.lokalizacja.href= „/moja_trasa” + $(to.val();
});

Wniosek, czemu nie?

Użycie tej sztuczki musi być naprawdę wymierzone, ponieważ jeśli pozwala wstrzyknąć kilka zmiennych lub kilka prostych tras, problemy mogą szybko stać się ważniejsze. W takich przypadkach to rozwiązanie może nie wystarczyć.

To rozwiązanie również ma to pokazaćAssetyczny potrafi zaproponować rozwiązania problemów, rozwiązania, które Chrząknięcie, Łykać ou Przekąska nie zawsze może zaoferować

★ ★ ★ ★ ★