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, implicitfalse): 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.