Nette Documentation Preview

syntax
Використання Latte зі Slim 4
****************************

.[perex]
Ця стаття, написана "Daniel Opitz":https://odan.github.io/2022/04/06/slim4-latte.html, описує використання Latte з Slim Framework.

Спочатку "встановіть Slim Framework":https://odan.github.io/2019/11/05/slim4-tutorial.html, а потім Latte за допомогою Composer:

```shell
composer require latte/latte
```


Конфігурація .[#toc-configuration]
----------------------------------

Створіть новий каталог `templates` у кореневому каталозі вашого проекту. Усі шаблони будуть поміщені туди пізніше.

Додайте новий ключ конфігурації `template` у ваш файл `config/defaults.php`:

```php
$settings['template'] = __DIR__ . '/../templates';
```

Latte компілює шаблони у власний PHP-код і зберігає їх у кеші на диску. Таким чином, вони працюють так само швидко, як якщо б були написані на рідному PHP.

Додайте новий ключ конфігурації `template_temp` до файлу `config/defaults.php`: Переконайтеся, що каталог `{project}/tmp/templates` існує і має права доступу на читання і запис.

```php
$settings['template_temp'] = __DIR__ . '/../tmp/templates';
```

Latte автоматично регенерує кеш при кожній зміні шаблону, що можна відключити у виробничому середовищі, щоб заощадити трохи продуктивності:

```php
// змінити на false у виробничому середовищі
$settings['template_auto_refresh'] = true;
```

Далі додайте визначення контейнера DI для класу `Latte\Engine`.

```php
<?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;
	},
];
```

Це саме по собі технічно працюватиме для рендерингу шаблону Latte, але нам також потрібно змусити його працювати з об'єктом відповіді PSR-7.

Для цього ми створюємо спеціальний клас `TemplateRenderer`, який робить цю роботу за нас.

Отже, створіть файл у `src/Renderer/TemplateRenderer.php` і скопіюйте/вставте цей код:

```php
<?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;
	}
}
```


Використання .[#toc-usage]
--------------------------

Замість того, щоб використовувати об'єкт Latte Engine безпосередньо, ми використовуємо об'єкт `TemplateRenderer` для візуалізації шаблону в об'єкт, сумісний з PSR-7.

Типовий клас обробника дій може виглядати наступним чином для рендерингу шаблону з ім'ям `home.latte`:

```php
<?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);
	}
}
```

Щоб це працювало, створіть файл шаблону в `templates/home.latte` з таким вмістом:

```latte
<ul n:if="$items">
	{foreach $items as $item}
		<li id="item-{$iterator->counter}">{$item|capitalize}</li>
	{/foreach}
</ul>
```

Якщо все налаштовано правильно, ви маєте побачити такий результат:

```latte
One
Two
Three
```

{{priority: -1}}
{{leftbar: /@left-menu}}

Використання Latte зі Slim 4

Ця стаття, написана Daniel Opitz, описує використання Latte з Slim Framework.

Спочатку встановіть Slim Framework, а потім Latte за допомогою Composer:

composer require latte/latte

Конфігурація

Створіть новий каталог templates у кореневому каталозі вашого проекту. Усі шаблони будуть поміщені туди пізніше.

Додайте новий ключ конфігурації template у ваш файл config/defaults.php:

$settings['template'] = __DIR__ . '/../templates';

Latte компілює шаблони у власний PHP-код і зберігає їх у кеші на диску. Таким чином, вони працюють так само швидко, як якщо б були написані на рідному PHP.

Додайте новий ключ конфігурації template_temp до файлу config/defaults.php: Переконайтеся, що каталог {project}/tmp/templates існує і має права доступу на читання і запис.

$settings['template_temp'] = __DIR__ . '/../tmp/templates';

Latte автоматично регенерує кеш при кожній зміні шаблону, що можна відключити у виробничому середовищі, щоб заощадити трохи продуктивності:

// змінити на false у виробничому середовищі
$settings['template_auto_refresh'] = true;

Далі додайте визначення контейнера DI для класу 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;
	},
];

Це саме по собі технічно працюватиме для рендерингу шаблону Latte, але нам також потрібно змусити його працювати з об'єктом відповіді PSR-7.

Для цього ми створюємо спеціальний клас TemplateRenderer, який робить цю роботу за нас.

Отже, створіть файл у src/Renderer/TemplateRenderer.php і скопіюйте/вставте цей код:

<?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;
	}
}

Використання

Замість того, щоб використовувати об'єкт Latte Engine безпосередньо, ми використовуємо об'єкт TemplateRenderer для візуалізації шаблону в об'єкт, сумісний з PSR-7.

Типовий клас обробника дій може виглядати наступним чином для рендерингу шаблону з ім'ям 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);
	}
}

Щоб це працювало, створіть файл шаблону в templates/home.latte з таким вмістом:

<ul n:if="$items">
	{foreach $items as $item}
		<li id="item-{$iterator->counter}">{$item|capitalize}</li>
	{/foreach}
</ul>

Якщо все налаштовано правильно, ви маєте побачити такий результат:

One
Two
Three