Utilisation de Latte avec Slim 4
Cet article, dont l'auteur est Daniel Opitz, décrit l'utilisation de Latte avec le Slim Framework.
Tout d'abord, installez le Slim Framework puis Latte en utilisant Composer :
composer require latte/latte
Configuration
Dans le répertoire racine du projet, créez un nouveau répertoire templates
. Tous les templates y seront placés
ultérieurement.
Dans le fichier config/defaults.php
, ajoutez une nouvelle clé de configuration template
:
$settings['template'] = __DIR__ . '/../templates';
Latte compile les templates en code PHP natif et les stocke dans un cache sur le disque. Ils sont donc aussi rapides que s'ils avaient été écrits en PHP natif.
Dans le fichier config/defaults.php
, ajoutez une nouvelle clé de configuration template_temp
:
Assurez-vous que le répertoire {project}/tmp/templates
existe et dispose des droits de lecture et d'écriture.
$settings['template_temp'] = __DIR__ . '/../tmp/templates';
Latte régénère automatiquement le cache à chaque modification du template, ce qui peut être désactivé en environnement de production pour économiser un peu de performance :
// en environnement de production, changez en false
$settings['template_auto_refresh'] = true;
Ensuite, ajoutez la définition du conteneur DI pour 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;
},
];
Le rendu du template Latte lui-même fonctionnerait techniquement, mais nous devons également nous assurer qu'il fonctionne avec l'objet de réponse PSR-7.
À cette fin, nous allons créer une classe spéciale TemplateRenderer
qui fera ce travail pour nous.
Ensuite, créez le fichier src/Renderer/TemplateRenderer.php
et copiez/collez ce code :
<?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;
}
}
Utilisation
Au lieu d'utiliser directement l'objet Latte Engine, nous utiliserons l'objet TemplateRenderer
pour rendre le
template dans un objet compatible PSR-7.
Une classe de gestionnaire d'action typique pourrait ressembler à ceci : Elle rendra le template nommé
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);
}
}
Pour que cela fonctionne, créez le fichier de template dans templates/home.latte
avec ce contenu :
<ul n:if=$items>
{foreach $items as $item}
<li id="item-{$iterator->counter}">{$item|capitalize}</li>
{/foreach}
</ul>
Si tout est correctement configuré, la sortie suivante devrait s'afficher :
One
Two
Three