Salt la conținut

Views (Template-uri)

Leto folosește clasa View pentru randarea template-urilor. Suportă atât fișiere .php clasice, cât și template-uri .twig prin integrarea cu Twig.

Randarea unui view

View caută template-ul în directoarele pe care i le dai (al treilea argument). Trebuie să specifici cel puțin un director de căutare, altfel render() nu găsește fișierul și returnează un string gol.

use Leto\Views\View;

class HelloController
{
    public function hello(): string
    {
        $view = new View('hello', [
            'name' => 'World',
            'items' => ['unu', 'doi', 'trei'],
        ], [__DIR__ . '/templates']);   // directorul unde stă hello.php sau hello.twig

        return $view->render();
    }
}

Un controller poate returna direct string-ul randat (ca mai sus) sau îl poate împacheta într-un Response. Vezi HTTP pentru tipurile acceptate.

Semnătura constructorului

new View($numeFisier, $variabile, $directoare, $obligatoriu);
  • $numeFisier (string): numele fișierului fără extensie.
  • $variabile (array, opțional): variabile disponibile în template.
  • $directoare (array, opțional): directoarele în care se caută template-ul.
  • $obligatoriu (bool, opțional, implicit false): controlează ce se întâmplă când template-ul nu e găsit.
Implicit ($obligatoriu = false), dacă template-ul nu e găsit render() returnează string gol, fără eroare. Setează al patrulea argument pe true dacă vrei ca lipsa template-ului să arunce o excepție (util ca să prinzi din greșeală o cale greșită).

Metode disponibile

MetodăDescriere
render()Randează template-ul și returnează output-ul
assign($cheie, $valoare, $escape = true)Setează o variabilă pentru template (vezi nota despre escapare mai jos)
assigns($array)Setează mai multe variabile deodată
vars()Returnează toate variabilele asignate
e($numeVariabila)Returnează valoarea unei variabile asignate, escapată HTML (primește numele variabilei, nu valoarea)
include($view, $assigns)Include alt view din interiorul template-ului curent

Escaparea HTML

Al treilea parametru al lui assign() ($escape) nu escapează nimic în versiunea curentă: valorile sunt stocate ca atare. Nu te baza pe el pentru securitate. Pentru output escapat, folosește e('numeVariabila') în template, care aplică htmlspecialchars. Într-un template Twig, folosește escaparea automată a Twig ({{ variabila }}).
// în template .php
<h1><?= $this->e('name') ?></h1>   <!-- escapat cu htmlspecialchars -->

Template-uri Twig

Twig este o dependință obligatorie a framework-ului, deci este mereu disponibil. Poți folosi fișiere .twig în loc de .php, iar View alege automat motorul de randare după extensie:

{# templates/hello.twig #}
<h1>Salut, {{ name }}!</h1>

<ul>
{% for item in items %}
    <li>{{ item }}</li>
{% endfor %}
</ul>
render() normalizează spațierea din output (colapsează tab-urile și secvențele repetate de spații albe la un singur caracter). Dacă randezi conținut sensibil la spații (<pre>, <textarea>, cod preformatat), fii conștient că spațierea va fi modificată.

HTML Helpers

Clasa Leto\Views\Html oferă o metodă statică simplă pentru generarea de link-uri:

use Leto\Views\Html;

echo Html::anchor('Mergi la exemplu', ['href' => 'https://example.com', 'class' => 'btn']);
// Rezultat: <a href="https://example.com" class="btn">Mergi la exemplu</a>
Html::anchor() nu escapează nici valorile atributelor, nici textul link-ului. Nu-i pasa date venite de la utilizator fără să le sanitizezi tu întâi, altfel poți produce HTML stricat sau injectabil.