PHP - "Template Engine"

Liittynyt
18.11.2019
Viestejä
33
Moi,
heti alkuun haluaisin sanoa että en ole ohjelmistokehityksen ammattilainen. Leipätyökseni seilaan maailman meriä, joka kaiketi näkyy koodissa. Jokatapauksessa, mulla olis pari kysymystä teille, oikeille ammattilaisille.

Eli siis, mulla on pienimuotoinen nettisivuprojekti, ja ihan oppimistarkoituksessa oon lähtenyt kokeilemaan, että miten tällänen ns. "Template Engine" toimii ja millaisia mahdollisuuksia se tarjoaa. En ole vertaamassa / vertaa tätä mihinkään oikeaan template engineen, kuten Twig ym.

Mulla on siis yksinkertainen ajatus tän suhteen, luon yksinkertaisen classin, joka lataa .html tiedoston sisällön (about näin)

PHP:
//construct method
if(!empty($template_file)) {
    if(file_exists($template_file)) {
        $this->template = file_get_contents($template_file);
    }
}
Eli, tää siis ensin varmistuu että sille on annettu toi template, ja jos se annettu template löytyy määritetyn polun päästä hakee sen template tiedoston sisällön.
Tämän jälkeen, loin methodin, joka etsii tuosta haetusta tiedostosta korvattavan syntaxin, sanotaan vaikka { VAR }, korvaa sen annetulla arvolla.

PHP:
public function pass($toReplace, $replaceWith) {
if(!empty($toReplace)) {
    $this->template_data[strtoupper($toReplace)] = htmlspecialchars($replaceWith);
    }
}
Ja tämän jälkeen sitten mulla on render -method, joka sit puolestaan renderöi uuden tiedoston.
PHP:
public function render() {
    if(count($this->template_data) > 0) {
        foreach($this->template_data as $var => $tpl_data) {
            $this->template = str_replace('{'.$var.'}', $tpl_data, $this->template);
        }
    }
    echo $this->template;
    }
Eli mua kiinnostaisi kuulla muiden mietteitä tästä, missä menee vikaan, mitä teen turhaan, jne. Ai niin ja millaisia turvallisuusriskejä tälläinen lähestymistapa luo?
Uskon itse, että tää kestää pienen - keskisuuren trafiikin ihan ongelmitta, mutta kovassa ruuhkassa voi jäädä jalkoihin (?) Ensin mietin että pitäiskö template-tiedosto cachettaa, mutta lopputulema johon tulin on seuraava;
- Sivusto tarjoilee dynaamista dataa, joten cachettelu ei taida oikein olla vaihtoehto search, replace -> cache -> render välissä(?)
- Miksi hitossa mä cachettelisin tekstitiedostoja ( cache -> search, replace -> render)

Kiitos, ja kumarrus, toivottavasti edes joku ymmärtää :D
 

SPu

Liittynyt
20.10.2016
Viestejä
41
Perusideana - pikkusivustolle ei kannata liian monimutkaista tehdä, mutta varmistu siitä että ladattavan templaten tiedostonimeä ei voi syöttää käyttäjän puolelta mitenkään (siis $template_file sun esimerkissä). Eli luo vaikkapa lista (tietokanta tai tiedosto) jossa tietty sivuosoite (esim /Login/) yhdistetään tiettyyn templatetiedoston (esim. /templates/login.php). Jos koodi yrittää arvata templatea vain tutkimalla onko tiedosto olemassa, niin siinä on riski päästä käsiksi asioihin jotka ei käyttäjälle kuulu (eli esim jos avaat sivun /pahasivu.php, niin template-engine avaa /templates/pahasivu.php ilman mitään tarkistusta, niin seuraavaksi kokeilen sitten ../../etc/htpasswd jne.jne).

Jos taustakoodi ei tee mitään erityisen raskasta ja sisältö on aina dynaamista, niin cache ei anna merkittävää etua nykyraudalla. Asia on eri jos puhutaan satojen tuhansien - miljoonien sivulatausten kokoluokasta päivittäin. Mutta tuntematta datan sisältöä tuohon ei voi oikein antaa yleispätevää vastausta. Voi olla myös fiksua cachettaa vain osa sivusta (esim. valikot/navigaatio, jos ne kasataan dynaamisesti). Hyvin simppelin cachesysteemin itse koodaus ei ole mikään monimutkainen asia, tässä nopeasti googlattu esimerkki: How to Create a Simple and Efficient PHP Cache - DZone Performance

Olen tuollaisen vastaavalla "simppeli template engine" -idealla toimivan sivustopohjan koodannut 10v+ sitten ja sitä ajan mittaan laajentanut, ja se on ollut käytössä kymmenillä nettisivuilla omissa projekteissa (ei megaisoja sivustoja, parhaimmat luokkaa 5-10 mil sivulatausta per kk), ja tein kesällä siitä täysin päivitetyn version samalla keep-it-simple -logiikalla. Tutkailin myös valmiita frameworkkeja, mutta ovat kovin raskaita ja monimutkaisia haluttuun tarkoitukseen mun osalta.
 
Viimeksi muokattu:
Liittynyt
18.11.2019
Viestejä
33
Perusideana - pikkusivustolle ei kannata liian monimutkaista tehdä, mutta varmistu siitä että ladattavan templaten tiedostonimeä ei voi syöttää käyttäjän puolelta mitenkään (siis $template_file sun esimerkissä). Eli luo vaikkapa lista (tietokanta tai tiedosto) jossa tietty sivuosoite (esim /Login/) yhdistetään tiettyyn templatetiedoston (esim. /templates/login.php). Jos koodi yrittää arvata templatea vain tutkimalla onko tiedosto olemassa, niin siinä on riski päästä käsiksi asioihin jotka ei käyttäjälle kuulu (eli esim jos avaat sivun /pahasivu.php, niin template-engine avaa /templates/pahasivu.php ilman mitään tarkistusta, niin seuraavaksi kokeilen sitten ../../etc/htpasswd jne.jne).

Jos taustakoodi ei tee mitään erityisen raskasta ja sisältö on aina dynaamista, niin cache ei anna merkittävää etua nykyraudalla. Asia on eri jos puhutaan satojen tuhansien - miljoonien sivulatausten kokoluokasta päivittäin. Mutta tuntematta datan sisältöä tuohon ei voi oikein antaa yleispätevää vastausta. Voi olla myös fiksua cachettaa vain osa sivusta (esim. valikot/navigaatio, jos ne kasataan dynaamisesti). Hyvin simppelin cachesysteemin itse koodaus ei ole mikään monimutkainen asia, tässä nopeasti googlattu esimerkki: How to Create a Simple and Efficient PHP Cache - DZone Performance

Olen tuollaisen vastaavalla "simppeli template engine" -idealla toimivan sivustopohjan koodannut 10v+ sitten ja sitä ajan mittaan laajentanut, ja se on ollut käytössä kymmenillä nettisivuilla omissa projekteissa (ei megaisoja sivustoja, parhaimmat luokkaa 5-10 mil sivulatausta per kk), ja tein kesällä siitä täysin päivitetyn version samalla keep-it-simple -logiikalla. Tutkailin myös valmiita frameworkkeja, mutta ovat kovin raskaita ja monimutkaisia haluttuun tarkoitukseen mun osalta.
Isosti kiitos kommentista!
Tällä hetkellä käytän tätä seuraavanlaisesti;
PHP:
//autoload.php sisältää DEFINE TEMPLATE_PATH hommelit
$template = new Template(TEMPLATE_PATH.'/index.tpl');
$esimerkki = 'jotain tekstiä';
$template->pass('varru', $esimerkki);
$template->render();
Kun teen tämän näin, eihän mulla periaateessa ole hätää, en muutenkaan mielelläni käytä $_GET superglobalia ihan siitä syystä, että menee helposti homma niin sanotusti vituiksi.
 
Toggle Sidebar

Statistiikka

Viestiketjut
107 051
Viestejä
2 148 244
Jäsenet
43 839
Uusin jäsen
Hobojaq

Hinta.fi

Ylös Bottom