Vijf redenen om te werken met een template parser

Inleiding

In deze tutorial vertel ik wat een template parser is, waarom je een template parser moet gebruiken en stel ik je voor aan drie verschillende parsers.

Wat is een template parser

Een template parser is een php script die een inhoud uit een bestand of uit de database inleest en verwerkt. Na het inlezen zal de tekst gescand worden op bepaalde keywords of patronen. Deze worden vervolgens vervangen voor een andere inhoud. Klinkt misschien wat lastig maar met een voorbeeld zal ik het enigzins verduidelijken. Hieronder staat een heel erg simpel voorbeeld van een Twig template.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Mijn eerste Twig Template</title>
    </head>
    <body>
        <h1>Hallo {{ name }}</h1>
    </body>
</html>

Let op de {{ name }} in de tekst. Stel nu dat we dat willen vervangen door een gebruikersnaam. We roepen de parser aan:

$twig->render('index.html.twig', array('name' => 'Frank'));

De parser verwerkt index.html en zal de variabele {{ name }} netjes vervangen voor Frank. Dit is niet het enigste dat een parser kan. Ben je nieuwsgierig geworden? Goed zo, lees rustig verder.

Vijf redenen

1. Automatische escaping

Hopelijk heb je wel eens gelezen dat je output moet escapen. Neem het aloude voorbeeld:

Op de ene plek laat je de gebruiker een willekeurige tekst invullen en op de andere plek zet je die tekst tussen je HTML. Wanneer je niet escaped kan je HTML ongeldig worden en nog erger er kan javascript uitgevoerd worden die jouw gebruikers zo naar een onveilige omgeving doorsturen. Escapen is dus heel erg belangrijk. Een goede template parser doet dit automatisch voor je tenzij je expliciet aangeeft dat je niet wilt escapen.

2. Makkelijk werken met layouts

Een goede template parser werkt met verschillende layouts. Super handig is vooral de mogelijkheid om je template onder te verdelen in blokken welke je op een later moment kunt overschrijven of aanvullen. Hieronder een voorbeeld van een Basis layout en een index.html:

base.html.twig:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>{% block title %}Welkom{% endblock %}</title>
    </head>
    <body>
        <div id="header">
            <img src="/images/logo.png">
            <nav>
                <ul>
                    <li><a href="/">Homepage</a></li>
                    <li><a href="/about">About</a></li>
                    <li><a href="/contact">Contact</a></li>
                </ul>
            </nav>
        </div>
        <div id="content">
            {% block content %}{% endblock %}
        </div>
        <div id="footer">
                &copy; Copyright 2011
        </div>
    </body>
</html>
index.html.twig:
{% extends 'base.html.twig' %}

{% block title %}
    Homepage
{% endblock %}

{% block content %}
    <h1>Welkom op mijn homepage</h1>
    <p>
        Deze pagina is gemaakt met een template parser en bestaat feitelijk uit een base template en
        een index template die alles van de base template over erft waardoor ik nu heel erg makkelijk
        extra pagina's kan toevoegen.
    </p>
{% endblock %}

In index.html.twig worden twee blokken overschreven van base.html.twig. De uitkomst is dan dus de inhoud van base.html.twig maar dan met een andere inhoud in het "title block" en "content block".

3. Makkelijk voor front-developers

Een ander groot voordeel van templates is dat het werk voor een front-developer makkelijker gemaakt wordt door de goede layout structuur. Typische zaken als de Header, de Footer en het Menu hoeven maar één keer in een template geplaatst te worden waarna ze door de andere templates ingevoegd kunnen worden. Andersom als je een bestaand ontwerp in je php applicatie wilt gebruiken zet je deze mooi in delen in de layout bestanden.

4. Separation of concerns

Een PHP applicatie wordt snel onoverzichtelijk en onhandelbaar. Je code onderverdelen in losse verantwoordelijkheden en verschillende categorieën helpt je om je code overzichtelijk te houden. Hierdoor is het niet meer dan logisch om je templates gescheiden te houden van de rest van je script, controllers of classes. Bij het gebruik van een template parser zal dit automatisch gaan. Je templates staan nu immers al in aparte bestanden.

5. Template functies

Template functies lijken op PHP functies. Ze voeren een bepaalde taak uit. Bijvoorbeeld Twig's include functie die een andere template zal invoegen:

{{ include('template.html') }}

Hoewel templates bedoeld zijn om output te genereren zijn er toch een flink aantal functies die je het leven als developer makkelijk maken. Daarnaast kun je ook je eigen functies schrijven en aan de template parser toevoegen.

Niet alleen bestanden

Templates hoeven niet altijd uit een bestand te komen. Een template kan ook een string zijn of uit de database komen. Daarnaast hoeft een template niet uit HTML te bestaan maar kan er ook XML of plain-text in een template staan. Na het verwerken van de template hoeft het resultaat niet perse naar de browser gestuurd te worden maar kan het ook gebruikt worden als body van een email bijvoorbeeld. Een template parser is dus veel ruimer inzetbaar dan dat je in eerste instantie zou denken.

Verschillende parsers

Ik heb al een beetje laten doorschemeren dat ik graag werk met Twig. Dit is niet toevallig maar komt omdat ik gebruik maak van het Symfony framework waar Twig een onderdeel van is. Een ander zeer populair is framework is Laravel die zelfs weer componenten gebruikt van Symfony maar wel een andere template parser gebruikt, namelijk Blade. Zo blijkt dat template parsers vaak standaard bij een PHP framework meegeleverd worden en daarbij moet er een keus gemaakt worden tussen verschillende parsers. Gebruik je geen framework? Geen probleem. Je kunt Template parsers ook los gebruiken. Een derde zeer populaire parser is Smarty. Alle drie de template parsers kunnen geïnstalleerd worden met Composer (zie mijn Composer tutorial) of gewoon gedownload worden. Hieronder een overzicht.

Naam Documentatie Github Composer
Blade https://laravel.com/docs/5.1/blade https://github.com/jenssegers/blade composer require jenssegers/blade
Smarty https://www.smarty.net/docs/en/ https://github.com/smarty-php/smarty composer require smarty/smarty
Twig https://twig.symfony.com/ https://github.com/twigphp/Twig composer require twig/twig

Reacties

Om een reactie te plaatsen kun je jezelf eenmalig registeren of je kunt hier inloggen.