Razširjanje Latte
Latte je zasnovan z mislijo na razširljivost. Čeprav njegov standardni nabor značk, filtrov in funkcij pokriva številne primere uporabe, pogosto potrebujete dodati lastno specifično logiko ali pomožna orodja. Ta stran ponuja pregled načinov, kako razširiti Latte, da bo popolnoma ustrezal zahtevam vašega projekta – od preprostih pomočnikov do kompleksne nove sintakse.
Načini razširitve Latte
Tukaj je hiter pregled glavnih načinov, kako lahko prilagodite in razširite Latte:
- Filtri po meri: Za formatiranje ali preoblikovanje podatkov
neposredno v izpisu predloge (npr.
{$var|myFilter}
). Idealno za naloge, kot so formatiranje datumov, urejanje besedila ali uporaba specifičnega ubežanja znakov. Uporabite jih lahko tudi za urejanje večjih blokov vsebine HTML tako, da vsebino ovijete v anonimni{block}
in nanjo uporabite filter po meri. - Funkcije po meri: Za dodajanje ponovno uporabne logike, ki jo
je mogoče klicati znotraj izrazov v predlogi (npr.
{myFunction($arg1, $arg2)}
). Uporabno za izračune, dostop do pomožnih funkcij aplikacije ali generiranje majhnih delov vsebine. - Oznake po meri: Za ustvarjanje popolnoma novih jezikovnih
konstruktov (
{mytag}...{/mytag}
alin:mytag
). Oznake ponujajo največ možnosti, omogočajo definiranje lastnih struktur, nadzor nad razčlenjevanjem predloge in implementacijo kompleksne logike izrisa. - Prevajalni prehodi: Funkcije, ki spreminjajo abstraktno sintaktično drevo (AST) predloge po razčlenjevanju, vendar pred generiranjem kode PHP. Uporabljajo se za napredne optimizacije, varnostne preglede (kot je Sandbox) ali samodejne spremembe kode.
- Nalagatelji po meri: Za spremembo načina, kako Latte išče in nalaga datoteke predlog (npr. nalaganje iz baze podatkov, šifriranega pomnilnika itd.).
Izbira prave metode razširitve je ključna. Preden ustvarite zapleteno značko, razmislite, ali bi zadostoval preprostejši filter ali funkcija. Poglejmo si primer: implementacija generatorja Lorem ipsum, ki kot argument sprejme število besed za generiranje.
- Kot značka?
{lipsum 40}
– Možno, vendar so značke primernejše za krmilne strukture ali generiranje zapletenih oznak. Značk ni mogoče uporabiti neposredno v izrazih. - Kot filter?
{=40|lipsum}
– Tehnično deluje, vendar so filtri namenjeni preoblikovanju vhodne vrednosti. Tukaj je40
argument, ne vrednost, ki se preoblikuje. To se zdi semantično napačno. - Kot funkcija?
{lipsum(40)}
– To je najbolj naravna rešitev! Funkcije sprejemajo argumente in vračajo vrednosti, kar je idealno za uporabo v katerem koli izrazu:{var $text = lipsum(40)}
.
Splošno priporočilo: Uporabljajte funkcije za izračune/generiranje, filtre za preoblikovanje in značke za nove jezikovne konstrukte ali zapletene oznake. Prehode uporabljajte za manipulacijo z AST in nalagatelje za pridobivanje predlog.
Neposredna registracija
Za pomožna orodja, specifična za projekt, ali hitre razširitve Latte omogoča neposredno registracijo filtrov in funkcij
v objekt Latte\Engine
.
Za registracijo filtra uporabite metodo addFilter()
. Prvi argument vaše filtrirne funkcije bo vrednost pred
znakom |
, naslednji argumenti pa so tisti, ki se posredujejo za dvopičjem :
.
$latte = new Latte\Engine;
// Definicija filtra (klicni objekt: funkcija, statična metoda itd.)
$myTruncate = fn(string $s, int $length = 50) => mb_substr($s, 0, $length);
// Registracija
$latte->addFilter('truncate', $myTruncate);
// Uporaba v predlogi: {$text|truncate} ali {$text|truncate:100}
Lahko registrirate tudi Nalagatelj filtrov (Filter Loader), funkcijo, ki dinamično zagotavlja klicne objekte filtrov glede na zahtevano ime:
$latte->addFilterLoader(fn(string $name) => /* vrne klicni objekt ali null */);
Za registracijo funkcije, uporabne v izrazih predloge, uporabite addFunction()
.
$latte = new Latte\Engine;
// Definicija funkcije
$isWeekend = fn(DateTimeInterface $date) => $date->format('N') >= 6;
// Registracija
$latte->addFunction('isWeekend', $isWeekend);
// Uporaba v predlogi: {if isWeekend($myDate)}Vikend!{/if}
Več informacij najdete v razdelku Ustvarjanje filtrov po meri in Funkcij.
Robusten način: Razširitev Latte
Medtem ko je neposredna registracija preprosta, je standardni in priporočeni način za pakiranje in distribucijo razširitev Latte prek razredov Extension. Razširitev služi kot osrednja konfiguracijska točka za registracijo več značk, filtrov, funkcij, prevajalnih prehodov in drugih elementov.
Zakaj uporabljati razširitve?
- Organizacija: Ohranja povezane razširitve (značke, filtri itd. za določeno funkcijo) skupaj v enem razredu.
- Ponovna uporabnost in deljenje: Enostavno zapakirate svoje razširitve za uporabo v drugih projektih ali za deljenje s skupnostjo (npr. prek Composerja).
- Polna moč: Značke po meri in prevajalne prehode lahko registrirate samo prek razširitev.
Registracija razširitve
Razširitev se registrira v Latte z metodo addExtension()
(ali prek konfiguracijske datoteke):
$latte = new Latte\Engine;
$latte->addExtension(new MyProjectExtension);
Če registrirate več razširitev in te definirajo enako poimenovane značke, filtre ali funkcije, ima prednost zadnja dodana razširitev. To tudi pomeni, da lahko vaše razširitve prepišejo izvorne značke/filtre/funkcije.
Kadar koli naredite spremembo v razredu in samodejno osveževanje ni izklopljeno, bo Latte samodejno ponovno prevedel vaše predloge.
Ustvarjanje razširitve
Za ustvarjanje lastne razširitve morate ustvariti razred, ki deduje od Latte\Extension. Za predstavo, kako taka razširitev izgleda, si oglejte vgrajeno CoreExtension.
Poglejmo si metode, ki jih lahko implementirate:
beforeCompile (Latte\Engine $engine): void
Pokliče se pred prevajanjem predloge. Metodo lahko uporabite na primer za inicializacije, povezane s prevajanjem.
getTags(): array
Pokliče se med prevajanjem predloge. Vrne asociativno polje ime značke ⇒ klicni objekt, kar so funkcije za razčlenjevanje značk. Več informacij.
public function getTags(): array
{
return [
'foo' => FooNode::create(...),
'bar' => BarNode::create(...),
'n:baz' => NBazNode::create(...),
// ...
];
}
Značka n:baz
predstavlja čisti n:atribut, torej
značko, ki jo je mogoče zapisati samo kot atribut.
Pri značkah foo
in bar
Latte samodejno prepozna, ali gre za parne značke, in če da, jih je mogoče
samodejno zapisati z n:atributi, vključno z različicami s predponami n:inner-foo
in n:tag-foo
.
Vrstni red izvajanja takšnih n:atributov je določen z njihovim vrstnim redom v polju, ki ga vrne metoda
getTags()
. Tako se n:foo
vedno izvede pred n:bar
, tudi če so atributi v HTML oznaki
navedeni v obratnem vrstnem redu kot <div n:bar="..." n:foo="...">
.
Če morate določiti vrstni red n:atributov med več razširitvami, uporabite pomožno metodo order()
, kjer
parameter before
xor after
določa, katere značke so razvrščene pred ali za značko.
public function getTags(): array
{
return [
'foo' => self::order(FooNode::create(...), before: 'bar'),
'bar' => self::order(BarNode::create(...), after: ['block', 'snippet']),
];
}
getPasses(): array
Pokliče se med prevajanjem predloge. Vrne asociativno polje ime prehoda ⇒ klicni objekt, kar so funkcije, ki predstavljajo t.i. prevajalni prehodi, ki prehajajo in spreminjajo AST.
Tudi tukaj lahko uporabite pomožno metodo order()
. Vrednost parametrov before
ali after
je lahko *
s pomenom pred/po vseh.
public function getPasses(): array
{
return [
'optimize' => Passes::optimizePass(...),
'sandbox' => self::order($this->sandboxPass(...), before: '*'),
// ...
];
}
beforeRender (Latte\Engine $engine): void
Pokliče se pred vsakim izrisom predloge. Metodo lahko uporabite na primer za inicializacijo spremenljivk, ki se uporabljajo med izrisom.
getFilters(): array
Pokliče se pred izrisom predloge. Vrne filtre kot asociativno polje ime filtra ⇒ klicni objekt. Več informacij.
public function getFilters(): array
{
return [
'batch' => $this->batchFilter(...),
'trim' => $this->trimFilter(...),
// ...
];
}
getFunctions(): array
Pokliče se pred izrisom predloge. Vrne funkcije kot asociativno polje ime funkcije ⇒ klicni objekt. Več informacij.
public function getFunctions(): array
{
return [
'clamp' => $this->clampFunction(...),
'divisibleBy' => $this->divisibleByFunction(...),
// ...
];
}
getProviders(): array
Pokliče se pred izrisom predloge. Vrne polje ponudnikov, ki so običajno objekti, ki jih značke uporabljajo med izvajanjem.
Dostopa se jim prek $this->global->...
. Več informacij.
public function getProviders(): array
{
return [
'myFoo' => $this->foo,
'myBar' => $this->bar,
// ...
];
}
getCacheKey (Latte\Engine $engine): mixed
Pokliče se pred izrisom predloge. Vračana vrednost postane del ključa, katerega zgoščena vrednost je vsebovana v imenu datoteke prevedene predloge. Za različne vračane vrednosti torej Latte generira različne datoteke predpomnilnika.