Twig: tħaffef il-ġenerazzjoni tal-mudelli tagħha
Aġenzija tal-web » Aħbarijiet diġitali » Twig: tħaffef il-ġenerazzjoni tal-mudelli tagħha

Twig: tħaffef il-ġenerazzjoni tal-mudelli tagħha

Riċentement, staqsejt lili nnifsi biex nirrifletti fuq is-soluzzjonijiet offruti minn Twig biex taċċessa l-proprjetajiet ta 'oġġett jew firxa.

Aċċess għal proprjetà ta' oġġett

Twig kien iddisinjat biex jissimplifika l-mudelli tagħna, kemm f'termini ta 'kodiċi kif ukoll f'termini ta' ndafa. Kienet iddisinjata wkoll biex tippermetti lill-integraturi, nies li mhux kollha għandhom għarfien dwar l-iżvilupp, aċċess faċli għall-proprjetajiet ta 'oġġett jew oħrajn. Dan grazzi għal sintassi simplifikata.

Imbagħad biss, bħala żviluppatur fuq kollox, staqsejt lili nnifsi l-mistoqsija ta 'kif qagħda kienet tagħmel biex tiddetermina liema metodu ta' oġġett għandu jissejjaħ.

Twig Sintassi

Fil-kodiċi li ġej tiegħi ser nassumi li qed nuża klassi bħal hawn taħt.

1
2
3
4
5
6
7
8
9
10
11
12
13
klassi Għan
{
privat $Isem;
pubblika $isem tal-utent;
pubblika funzjoni getName() {
ritorn $ dan-> isem;
}
pubblika funzjoni getUsername() {
ritorn $ dan-> isem l-utent;
}
}

Dan huwa kif se nsejjaħ il-mudell tiegħi minn kontrollur Symfony.

1
2
3
pubblika funzjoni indiċiAzzjoni() {
ritorn firxa("oġġett" => $oġġett);
}

S'issa, kollox huwa ċar. L-oġġett tiegħi jidher eżattament bħall-oġġetti li nista' nuża fil-proġetti tiegħi.

Parsing tad-dikjarazzjonijiet fi Twig

1
{{ object.name }}

Minn issa 'l quddiem se naraw kif Twig taħdem mas-sejħiet tagħna. Hawnhekk, nitolbu lil Twig biex tieħu l-valur isem tal-oġġett tiegħi, ħlief li għal Twig li hija biss sejħa PHP sempliċi fl-aħħar, din il-varjabbli hija inaċċessibbli. Twig għalhekk żiedet prokura għall-astratt u tara liema proprjetajiet u metodi huma disponibbli.

Twig għalhekk se jitlob fl-ordni hawn taħt biex jagħmel kontrolli fuq l-oġġett.

  1. Ara jekk oġġett hija firxa u jekk isem hija ċavetta;
  2. Ara jekk oġġett huwa oġġett u jekk isem huwa attribut aċċessibbli;
  3. Ara jekk oġġett huwa oġġett u jekk isem huwa metodu;
  4. Ara jekk oġġett huwa oġġett u jekk getName huwa metodu;
  5. Ara jekk oġġett huwa oġġett u jekk isName huwa metodu.
    Hawnhekk, bin-notazzjoni li użajna, kellna nistennew ir-4 kundizzjoni biex tasal fl-element tagħna. Għax isem mhuwiex attribut aċċessibbli, u lanqas metodu.

    1
    {{ object.username }}

F'dan il-każ, qed nippruvaw naċċessaw username. Dan l-attribut huwa attribut pubbliku (f'Symfony, rari ltqajt ma' dan il-każ). Irridu nistennew it-2 kundizzjoni.

1
{{ object.getName() }}

Fit-tielet każ tagħna, nipprova nsejjaħ il-metodu tiegħi direttament. Nirċievi r-riżultat tiegħi mit-tielet kundizzjoni, li hija kundizzjoni aktar mgħaġġla.

1
{{ object.getUsername() }}

Fir-raba' u l-aħħar każ tagħna, nipprova nuża l-metodu tiegħi direttament. Nirċievi r-riżultat tiegħi mit-tielet kundizzjoni. F'dan il-każ, nressaq kundizzjoni addizzjonali biex taċċessa l-valur tiegħi.

Interpretazzjoni tal-mudelli Twig

Meta ħarist lejn dan id-dettall, ħsibt dwar kif l-iżviluppaturi ta' Twig setgħu għamlu l-caching u l-kumpilazzjoni tal-mudelli. Ma damx wisq biex wasalt għall-konklużjoni li bil-ftit informazzjoni u l-libertà li joffri l-maniġer tal-mudelli, il-fajls tagħna huma sempliċement traskritti f'PHP b'mod simili għal dak li nistgħu nagħmlu totalment. Tista 'wkoll tara għalik innifsek billi tfittex fil-folder tal-cache tiegħek.

1
2
{# Fergħa tal-mudell #}
{{ object.name }}
Mudell interpretat fil-PHP
1
echo twig_escape_filter($this->env, $this->getAttribute((isset($context["oġġett"]) ? $context["oġġett"] : $this->getContext($context, "oġġett")), "isem"), "html", null, veru);

L-ewwel blokk jaqbel ma' dak li nnutajt fil-mudell tal-friegħi tiegħi, it-tieni blokk jaqbel mal-verżjoni tradotta li sibt fil-folder tal-cache.

Aħna ninnotaw li l-fergħa ġiet tradotta għal PHP iżda li l-ebda element ma ppermettilha tbassar liema metodu għandu jissejjaħ eżattament. Il-metodu branch_escape_filter jista' jitqabbel ma' prokura. Huwa f'dan il-metodu li se niddeterminaw kif aħna naċċessaw l-attribut.

konklużjoni

Għalkemm il-mudelli tal-friegħi huma awtomatikament cache minn Symfony, il-verżjoni PHP biss tinżamm iżda mingħajr interpretazzjoni ta 'dak li trid tirkupra. Fit-teorija, hemm għalhekk hawn, il-mezzi biex itejb is-sejħiet u l-ħin tal-ġenerazzjoni tal-mudelli tagħna minħabba li l-verifika titwettaq f'kull sejħa.

Kriterju

Xtaqt li jkolli idea dwar il-kisbiet li jistgħu jsiru billi nsejjaħ il-metodi aktar milli " alias ".

Fl-ewwel każ, insejjaħ template li se jsejjaħ 10 darbiet l-istess oġġett li min-naħa tiegħu jsejjaħ 25 alias. Dan jirrappreżenta 250 sejħa. Ir-riżultati huma eżaltati bil-linja ta '10 biex jippermettu kalkoli preċiżi dwar il-gwadann tal-prestazzjoni.

It-tieni nett, insejjaħ mudell li se jsejjaħ l-istess oġġett 10 darbiet u li min-naħa tiegħu jsejjaħ 25 metodu (dejjem permezz tal-istess prokura bħal għall-psewdonimi). Dak għal darb'oħra 250.

Għamilt is-sejħa ta 'dawn il-mudelli 5 darbiet kull wieħed.

Innota li s-sejħiet kollha lill-mudell li jagħmlu sejħiet lill-metodi huma aktar mgħaġġla. Billi nieħdu l-medji, ninnutaw li l-mudell li juża psewdonimi huwa itwal b'54,6 millisekondi (197.4 – 142.8).

Billi nagħmlu kalkolu malajr, ninnutaw li jekk innaqqsuh għal każ ġenerali, il-mudell li juża sejħiet għal metodi huwa aktar mgħaġġel bħala medja fuq l-istess data b'madwar 26.7%. Dan jista 'jkun interessanti meta tagħmel ħafna sejħiet għal oġġetti.

Dan it-tieni artikolu jsegwi l-ewwel post li jagħti soluzzjonijiet ta 'malajr biex jottimizzaw il-ġenerazzjoni ta' mudelli. Huwa frott ta 'ottimizzazzjoni diġà użata fuq siti fil-produzzjoni li kellhom rata għolja wisq ta' latenza.

Aħna nużaw kollha jinkludi de Zkuk biex niċċaqilqu jew fattur tal-fehmiet tagħna. Imma forsi qatt ma fhimt għaliex kellna l-abbiltà li ngħaddu l-parametri, meta jinkludu bażiku jirtu varjabbli mill-kuntest attwali.

1
{% jinkludu “ProjectMyBundle:Sub:template.html.twig” %}

Ħafna drabi nużaw din in-notazzjoni. F'dan il-każ, l-include tagħti kopja tal-varjabbli kollha tagħna lill-mudell tagħna. Dan mhux dejjem meħtieġ, u aħna żbaljati li nikkopjaw il-varjabbli kollha tagħna.

Interess tal-għażla "unika".

Għal żmien twil staqsejt x'kien il-punt ta 'din l-għażla. Barra minn hekk, irid jingħad li d-dokumentazzjoni ma tagħtix ħafna informazzjoni. Tista' tagħti ħarsa lejn id-dokumentazzjoni Twig includes. Jagħti ftit element iżda jagħti speċjalment żvantaġġ u l-ebda vantaġġ: li wieħed jgħaddi mingħajr ċerti varjabbli. Meta titqies b'dan il-mod, mhix profittabbli; għaliex għandi nagħmel mingħajr xi varjabbli.

Ejja nimplimentaw l-inklużi tagħna! Ejja ngħidu l-mudell tal-bażi tagħna għandu 5 varjabbli u ninkludi mudell li juża biss waħda minn dawn il-varjabbli, din hija n-notazzjoni li tkun preferibbli.

1
{% jinkludu "ProjectMyBundle:Sub:template.html.twig" bi {"object": myVar} % biss}

B'dan il-mod varjabbli "oġġett" biss se jkun disponibbli fil-mudell tiegħi. Dan jillimita l-ikkupjar ta 'varjabbli inutli, u għalhekk ta' allokazzjoni tal-memorja (iffrankar ta 'ħin u konsum tal-memorja).

Kodiċi u każijiet ta' użu

1
2
3
4
5
6
// Kontrollur
// Hawnhekk il- jiġġenera mudell billi jgħaddi varjabbli imponenti (ġabra) li jkun fiha l-oġġetti kollha għal tabella partikolari
pubblika funzjoni testAction() {
$oggetti = $ dan-> kontenitur-> tikseb (“doctrine.orm.default_entity_manager”)->getRepository(“ProjectMyBundle:Test”)-> findAll();
ritorn firxa("oġġetti" => $oggetti);
}

Aħna loop fuq il-kollezzjoni tagħna u nagħtu mudell kull iterazzjoni tal-ġbir għall-mudell. F'dan il-każ, kull darba li nsejħu għall-integrazzjoni ta' mudell, il-varjabbli kollha jiġu kkupjati kif ukoll dawk mgħoddija b' l-għażla "bil".. Fl-ewwel każ tagħna nistgħu nimmaġinaw li naċċessaw il-kollezzjoni tagħna (l-oġġetti) kif ukoll l-iterazzjoni attwali tagħna (l-oġġett).

1
2
3
4
5
{#Mudell 1#}
{% għall oġġett f'oġġetti %}
{% jinkludu "ProjectMyBundle:Sub:template.html.twig" bi {"object": object} %}
{% endfor %}

Fit-tieni każ tagħna, nattiva l-għażla biss li jippermettilek tikkopja biss il-varjabbli mgħoddija bħala parametri. Faċli?

1
2
3
4
5
{#Mudell 2#}
{% għall oġġett f'oġġetti %}
{% jinkludu "ProjectMyBundle:Sub:template.html.twig" bi {"object": object} % biss
{% endfor %}

Kriterju

Għamilt it-testijiet bil-mudelli u l-kodiċi mogħtija fil-parti ta 'hawn fuq. Jien wettaqt b'5 iterazzjonijiet ta 'kull mudell, ftakar li tbattal il-cache qabel kull ewwel test.

B'din il-graff, nistgħu naraw li t-tagħbija hija ġeneralment itwal għal dawk li ma jużawx l-għażla biss. Id-differenza għandha tendenza li tonqos wara l-caching. Dan huwa dovut għall-fatt li l-mudell tiegħi huwa żgħir u jintużaw ftit varjabbli. F'każijiet aktar applikati, hemm qligħ sa 30%.

Hawnhekk, jekk nagħmlu medja tal-valuri, nilħqu differenza medja ta '9 ms (48,6 – 39,6 = 9). Nistgħu għalhekk nikkalkulaw qligħ approssimattiv ta '20% anke jekk dan għandu jitqiegħed f'perspettiva fil-każ tagħna peress li l-ewwel sparatura hija terriblement twila mingħajr l-użu ta' " biss ".

★ ★ ★ ★ ★