Задать вопрос
asumin
@asumin
/Web/PHP

Можно ли в ZF3 создавать свои объекты типа ViewModel и выносить туда логику представления?

Насколько идеалогически правильно, делать собственные классы viewModel, чтобы вынести в них логику представления и сделать шаблоны почище ?

Например так:
Контроллер
public function indexAction()
{
      $products = new ProductsCollection;
      $vm = new ProductsViewModel($products);
      return $vm;
}


ViewModel
class ProductsViewModel extends ViewModel
{
    public function __construct(ProductsCollection $products)
    {
        $items = array();
        foreach ($products as $product) {
            $items[] = [
                'url' => '/product/' . $product['id'],
                'price' => !empty($product['price']) ? \number_format($product['price'], 2, ',', ' ') : '',
                'title' => $product['title'],
                'class' => empty($product['hot-price']) ? '' : 'active',
                'showCartBtn' => !empty($product['price'])
            ];
        }

        $this->setVariable('items', $items);
    }
}


Шаблон
<ul>
    <?php foreach ($items as $item): ?>
        <li>
            <div>
                <a href="<?= $this->escapeHtml($item['url']) ?>" class="<?= $item['class'] ?>">
                    <?= $item['title'] ?>
                </a>
            </div>
            <div>
            <?php if ($item['showCartBtn']):?>
                <form method="post">
                    <button type="submit" class="btn btn-primary">
                        Купить за <?= $item['price'] ?>
                    </button>
                </form>
            <?php else:?>
                <button type="submit" class="btn">
                    Нет в продаже
                </button>
            <?php endif;?>
            </div>
        </li>
    <?php endforeach; ?>
</ul>
  • Вопрос задан
  • 103 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
@novrm
Не только можно, но и нужно...
Когда ваш проект разрастется до беспредела - создание отдельных классов для представления станет единственным решением для оптимизации видов.
Простой проект этого не требует.

Этот рецепт, кстати относится к любому компоненту ZF3.
Чем сложнее - тем больше приходится дробить дабы не утонуть в океане кода.

----------------
Еще одно.
Вам не нужно наследовать класс представления от ViewModel.
Зачем такое?
Просто создавайте класс в котором "оформляйте" переменные для видов.
... и передавайте переменные...

return (new ViewModel())
        ->setVariables($productsView->getItemsVariables())
        ;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vanillathunder
Если кажется что без этого будет хуже, то используйте. Фреймворк в этом не ограничивает.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы