Я хочу написать свой View Viewer более объектно-ориентированным способом, чтобы использовать некоторые преимущества объектно-ориентированной модели. Я начал с того, что определил поведение для моих моделей, чтобы можно было указать способ визуализации с помощью Twig.
Я наткнулся на это видео , которое хорошо отразило мои мысли.
Например, допустим, у меня есть модель User, которую я хочу отобразить в нескольких местах на моем веб-сайте. Я хотел бы определить, скажем, интерфейс «Twigable», методы которого сообщают twig, как визуализировать эту модель.
Как бы мне реализовать масштабируемую реализацию?
РЕДАКТИРОВАТЬ: Iнемного поэкспериментировал. Сейчас не так много абстракций, в том числе это может указывать на то, что мне нужно.
У меня есть моя модель User.php:
<?php
namespace App\Model;
use Twig\Environment;
class User
{
private $name;
private $age;
private $city;
public function __construct(string $name, int $age, string $city) {
$this->name = $name;
$this->age = $age;
$this->city = $city;
}
public function render(Environment $twig)
{
return $twig->load('model/user.html.twig')->render(['name' => $this->name]);
}
}
Затем я добавляю ее в конфигурацию, чтобы передатьсреда ветки в методе рендеринга из моего шаблона:
twig:
globals:
twig_env: '@Twig\Environment'
Я передаю экземпляр класса User в шаблон:
// ... inside the controller action
$user = new \App\Model\User('John Doe', 40, 'London');
return $this->render('index.html.twig', [
'user' => $user,
]);
// ...
И, наконец,, в шаблоне:
{# ... inside index.html.twig #}
{% block body %}
{{ user.render(twig_env) }}
{% endblock %}
{# ... #}
Теперь шаблону ветки больше не нужно «знать», как выглядит мой класс User, только то, что он существует и отображается.
Это хорошая идея?