Utilizzo di Latte con Slim 4
Questo articolo scritto da Daniel Opitz descrive come utilizzare Latte con il framework Slim.
Per prima cosa, installate il framework Slim e poi Latte usando Composer:
composer require latte/latte
Configurazione
Creare una nuova cartella templates
nella cartella principale del progetto. Tutti i modelli saranno collocati lì
in seguito.
Aggiungere una nuova chiave di configurazione template
nel file config/defaults.php
:
$settings['template'] = __DIR__ . '/../templates';
Latte compila i modelli in codice PHP nativo e li memorizza in una cache sul disco. In questo modo sono veloci come se fossero stati scritti in PHP nativo.
Aggiungete una nuova chiave di configurazione template_temp
nel vostro file config/defaults.php
:
Assicuratevi che la cartella {project}/tmp/templates
esista e abbia i permessi di accesso in lettura e
scrittura.
$settings['template_temp'] = __DIR__ . '/../tmp/templates';
Latte rigenera automaticamente la cache ogni volta che si cambia il modello, cosa che può essere disattivata nell'ambiente di produzione per risparmiare un po' di prestazioni:
// cambiare in false nell'ambiente di produzione
$settings['template_auto_refresh'] = true;
Quindi, aggiungere le definizioni del contenitore DI per la classe Latte\Engine
.
<?php
use Latte\Engine;
use Latte\Loaders\FileLoader;
use Psr\Container\ContainerInterface;
// ...
return [
// ...
Engine::class => function (ContainerInterface $container) {
$latte = new Engine();
$settings = $container->get('settings');
$latte->setLoader(new FileLoader($settings['template']));
$latte->setTempDirectory($settings['template_temp']);
$latte->setAutoRefresh($settings['template_auto_refresh']);
return $latte;
},
];
Questo da solo funzionerebbe tecnicamente per rendere un template Latte, ma dobbiamo anche farlo funzionare con l'oggetto risposta PSR-7.
A tale scopo, creiamo una classe speciale TemplateRenderer
che svolge questo lavoro per noi.
Creare quindi un file in src/Renderer/TemplateRenderer.php
e copiare/incollare questo codice:
<?php
namespace App\Renderer;
use Latte\Engine;
use Psr\Http\Message\ResponseInterface;
final class TemplateRenderer
{
public function __construct(
private Engine $engine,
) {
}
public function template(
ResponseInterface $response,
string $template,
array $data = [],
): ResponseInterface
{
$string = $this->engine->renderToString($template, $data);
$response->getBody()->write($string);
return $response;
}
}
Uso
Invece di usare direttamente l'oggetto Latte Engine, usiamo l'oggetto TemplateRenderer
per renderizzare il modello
in un oggetto compatibile con PSR-7.
Una tipica classe di gestore di azioni potrebbe assomigliare a questa per rendere un modello con il nome
home.latte
:
<?php
namespace App\Action\Home;
use App\Renderer\TemplateRenderer;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
final class HomeAction
{
public function __construct(
private TemplateRenderer $renderer,
) {
}
public function __invoke(
ServerRequestInterface $request,
ResponseInterface $response,
): ResponseInterface
{
$viewData = [
'items' => ['one', 'two', 'three'],
];
return $this->renderer->template($response, 'home.latte', $viewData);
}
}
Per farlo funzionare, creare un file template in templates/home.latte
con questo contenuto:
<ul n:if="$items">
{foreach $items as $item}
<li id="item-{$iterator->counter}">{$item|capitalize}</li>
{/foreach}
</ul>
Se tutto è configurato correttamente, si dovrebbe vedere il seguente output:
One
Two
Three