Определение метода объекта для рендеринга в виде веточек - PullRequest
0 голосов
/ 10 октября 2019

Я хочу написать свой 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, только то, что он существует и отображается.

Это хорошая идея?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...