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
version: 3.0