Šakelė: paspartinkite jos šablonų generavimą
Neseniai paprašiau savęs apmąstyti „Twig“ siūlomus sprendimus, kaip pasiekti objekto ar masyvo savybes.
Prieiga prie objekto nuosavybės
„Twig“ buvo sukurta siekiant supaprastinti mūsų šablonus tiek kodo, tiek švaros požiūriu. Jis taip pat buvo sukurtas taip, kad integratoriai, žmonės, kurie ne visi turi žinių apie vystymąsi, galėtų lengvai pasiekti objekto ar kitų savybių. Tai supaprastintos sintaksės dėka.
Tik tada, būdamas visų pirma kūrėjas, uždaviau sau klausimą, kaip šakelei sekasi nustatyti, kokį objekto metodą reikėtų vadinti.
Šakelių sintaksė
Šiame kode darysiu prielaidą, kad naudoju klasę, kaip nurodyta toliau.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
klasė Objektas
{
privatus $Vardas;
visuomenės $vartotojo vardas;
visuomenės funkcija getName() {
grįžti $ tai-> vardas;
}
visuomenės funkcija gauti vartotojo vardą() {
grįžti $ tai->vartotojo vardas;
}
}
|
Taip pavadinsiu savo šabloną iš Symfony valdiklio.
1
2
3
|
visuomenės funkcija indexAction() {
grįžti masyvas("objektas" => $objektas);
}
|
Kol kas viskas aišku. Mano objektas atrodo lygiai taip pat, kaip objektai, kuriuos galiu naudoti savo projektuose.
Deklaracijų analizė „Twig“.
1
|
{{ object.name }}
|
Nuo šiol matysime, kaip Twig veikia su mūsų skambučiais. Čia mes prašome Twig paimti vertę pavadinimas mano objekto, išskyrus tai, kad Twig, kuris galiausiai yra tik paprastas PHP iškvietimas, šis kintamasis yra nepasiekiamas. Todėl „Twig“ pridėjo tarpinį serverį, kad galėtumėte abstrahuoti ir pamatyti, kokios savybės ir metodai yra prieinami.
Todėl „Twig“ toliau nurodyta tvarka paprašys patikrinti objektą.
- Pažiūrėkite, ar objektas yra masyvas ir jei pavadinimas yra raktas;
- Pažiūrėkite, ar objektas yra objektas ir jei pavadinimas yra prieinamas atributas;
- Pažiūrėkite, ar objektas yra objektas ir jei pavadinimas yra metodas;
- Pažiūrėkite, ar objektas yra objektas ir jei getName yra metodas;
- Pažiūrėkite, ar objektas yra objektas ir jei isVardas yra metodas.
Čia su mūsų naudota žyma turėjome laukti, kol 4-oji sąlyga pasieks mūsų elementą. Nes pavadinimas nėra pasiekiamas atributas ar metodas.1{{ object.username }}
Šiuo atveju mes bandome pasiekti Nick. Šis atributas yra viešas atributas (Symfony retai susidurdavau su šiuo atveju). Belieka laukti 2-os sąlygos.
1
|
{{ object.getName() }}
|
Trečiuoju atveju savo metodą bandau vadinti tiesiogiai. Rezultatą gaunu iš trečios sąlygos, kuri yra greitesnė.
1
|
{{ object.getUsername() }}
|
Ketvirtuoju ir paskutiniu atveju bandau savo metodą naudoti tiesiogiai. Rezultatą gaunu iš trečios sąlygos. Šiuo atveju įkeliu papildomą sąlygą, kad galėčiau pasiekti savo vertę.
„Twig“ šablonų interpretavimas
Kai pažvelgiau į šią detalę, pagalvojau, kaip „Twig“ kūrėjai galėjo atlikti talpyklos kaupimą ir šablonų kompiliavimą. Neilgai trukus padariau išvadą, kad turėdamas mažai informacijos ir laisvę, kurią siūlo šablonų tvarkyklė, mūsų failai tiesiog perrašomi į PHP panašiai, kaip ir mes galėtume padaryti. Taip pat galite įsitikinti patys, žiūrėdami į talpyklos aplanką.
1
2
|
{# Šablono šaka #}
{{ object.name }}
|
1
|
echo twig_escape_filter($this->env, $this->getAttribute((isset($context["objektas"]) ? $context["objektas"] : $this->getContext($context, "objektas")), „vardas“), „html“, nulis, tiesa);
|
Pirmasis blokas atitinka tai, ką pažymėjau savo šakelės šablone, antrasis blokas atitinka išverstą versiją, kurią radau talpyklos aplanke.
Atkreipiame dėmesį, kad šaka buvo išversta į PHP, bet joks elementas neleido nuspėti, kuris metodas turėtų būti tiksliai iškviestas. Metodas filialo_pabėgimo_filtras galima palyginti su įgaliotuoju serveriu. Būtent šiuo metodu nustatysime, kaip pasiekiame atributą.
išvada
Nors šakelių šablonus automatiškai talpina Symfony, išsaugoma tik PHP versija, tačiau neaiškinama, ką norite gauti. Teoriškai čia yra priemonių, skirtų optimizuoti skambučius ir mūsų šablonų generavimo laiką, nes patikrinimas atliekamas kiekvieno skambučio metu.
etalonas
Aš vis dar norėjau turėti idėją apie naudą, kurią galima pasiekti naudojant metodus, o ne " pravardė ".
Pirmuoju atveju aš iškviečiu šabloną, kuris 10 kartų iškvies tą patį objektą, kuris savo ruožtu iškviečia 25 slapyvardžius. Tai reiškia 250 skambučių. Rezultatai padidinami 10 kilpa, kad būtų galima tiksliai apskaičiuoti našumo padidėjimą.
Antra, aš iškviečiu šabloną, kuris iškvies tą patį objektą 10 kartų ir kuris savo ruožtu iškviečia 25 metodus (visada per tą patį tarpinį serverį kaip ir slapyvardžiams). Tai vėl 250.
Iškviečiau šiuos šablonus po 5 kartus.
Atminkite, kad visi šablono iškvietimai, iškviečiantys metodus, yra greitesni. Atsižvelgdami į vidurkius, pastebime, kad šablonas naudojant slapyvardžius yra ilgesnis 54,6 milisekundės (197.4–142.8).
Atlikę greitą skaičiavimą, pastebime, kad sumažinus jį iki bendrojo atvejo šablonas, naudojant metodų iškvietimus, tais pačiais duomenimis yra greitesnis vidutiniškai maždaug 26.7%. Tai gali būti įdomu daug skambinant į objektus.
Šis antrasis straipsnis yra po pirmojo įrašo, kuriame pateikiami greiti sprendimai, kaip optimizuoti šablonų generavimą. Tai optimizavimo vaisius, jau naudojamas gamybos vietose, kuriose buvo per didelis delsos dažnis.
Mes naudojame visus yra de Smeigtukas pakeisti arba atsižvelgti į mūsų požiūrį. Bet galbūt jūs niekada nesupratote, kodėl turėjome galimybę perduoti parametrus, o pagrindinis įtraukimas paveldi kintamuosius iš dabartinio konteksto.
1
|
{% įtraukti „ProjectMyBundle:Sub:template.html.twig“ %}
|
Dažnai naudojame šį žymėjimą. Tokiu atveju įtraukimas pateiks visų mūsų kintamųjų kopijas į mūsų šabloną. Tai ne visada būtina, ir mes klystame kopijuodami visus savo kintamuosius.
„Vienintelio“ pasirinkimo palūkanos
Ilgai galvojau, kokia šio pasirinkimo prasmė. Be to, reikia pasakyti, kad dokumentuose nėra daug informacijos. Galite pažvelgti į „Twig“ dokumentaciją. Tai suteikia mažai elementų, bet suteikia ypač trūkumo ir jokio pranašumo: apsieiti be tam tikrų kintamųjų. Taip žiūrint, tai nėra pelninga; kodėl turėčiau apsieiti be kai kurių kintamųjų.
Įdiegkime mūsų įtrauktus! Tarkime, kad mūsų baziniame šablone yra 5 kintamieji ir aš įtraukiu šabloną, kuris naudoja tik vieną iš šių kintamųjų.
1
|
{% įtraukti „ProjectMyBundle:Sub:template.html.twig“ su {"object": myVar} tik %}
|
Tokiu būdu mano šablone bus galimas tik „objekto“ kintamasis. Tai riboja nenaudingų kintamųjų kopijavimą, taigi ir atminties paskirstymą (taupo laiko ir atminties sąnaudas).
Kodas ir naudojimo atvejai
1
2
3
4
5
6
|
// Valdiklis
// Čia generuojamas šablonas, perduodamas įspūdingą kintamąjį (kolekciją), kuriame yra visi nurodytos lentelės objektai
visuomenės funkcija testAction() {
$objektai = $ tai->konteineris->gauti(„doctrine.orm.default_entity_manager“)->getRepository(„ProjectMyBundle: Test“)->rasti viską();
grįžti masyvas("daiktai" => $objektai);
}
|
Peržiūrime savo kolekciją ir kiekvienai kolekcijos iteracijai suteikiame šabloną. Tokiu atveju kiekvieną kartą, kai raginame integruoti šabloną, nukopijuojami visi kintamieji, taip pat tie, kurie perduodami parinktis „su“.. Pirmuoju atveju galėtume labai gerai įsivaizduoti prieigą prie savo kolekcijos (objektų) ir dabartinės iteracijos (objekto).
1
2
3
4
5
|
{#1 šablonas#}
{% forumas objektas objektuose %}
{% įtraukti "ProjectMyBundle:Sub:template.html.twig" su {"object": object} %}
{% endfor %}
|
Antruoju atveju aš suaktyvinu parinktį tik kuri leidžia kopijuoti tik kaip parametrus perduotus kintamuosius. Lengva?
1
2
3
4
5
|
{#2 šablonas#}
{% forumas objektas objektuose %}
{% įtraukti "ProjectMyBundle:Sub:template.html.twig" su {"object": object} tik %}
{% endfor %}
|
etalonas
Bandymus atlikau su šablonais ir kodu, pateiktu aukščiau esančioje dalyje. Atlikau 5 kiekvieno šablono iteracijas, nepamiršdamas ištuštinti talpyklos prieš kiekvieną pirmąjį bandymą.
Naudodami šį grafiką matome, kad įkėlimas paprastai yra ilgesnis tiems, kurie nenaudoja šios parinkties tik. Skirtumas mažėja po talpyklos. Taip yra dėl to, kad mano šablonas yra mažas ir naudojama nedaug kintamųjų. Daugiau taikomų atvejų prieaugis siekia iki 30 proc.
Čia, jei suvidurkiname vertes, gauname vidutinį 9 ms skirtumą (48,6 – 39,6 = 9). Todėl galime apskaičiuoti apytikslį 20 % padidėjimą, net jei mūsų atveju tai yra perspektyvi, nes pirmasis kadras yra siaubingai ilgas nenaudojant „ tik ".