@Insout

Обращение к методам из вью это говнокод?

Здравствуйте.

Есть некий объект, к этому объекту прикрепляются пользователи, допустим этот объект это задача, а пользователи - исполнители.

Во вью, помимо контента самой задачи, необходимо вывести всех пользователей которые прикреплены к данной задаче.

Обращение к функции из вью это нормально или необходимо заранее подготовить массив из пользователей и просто вывести циклом его во вью ?

<?php foreach ($model->relUsers as $t) : ?>
        <span><?= User::getById($t,'name') ?></span>
<?php endforeach; ?>
  • Вопрос задан
  • 481 просмотр
Пригласить эксперта
Ответы на вопрос 6
toxicmt
@toxicmt
CTO at hexlet.io
Функции бывают разные.

Ключевые понятия:

1. Идемпотентность.
1. Чистая функция.
1. Побочные эффекты.
1. Детерминированность

Так вот во вью, в идеале должны вызываться только чистые функции или на худой конец функции без побочных эффектов.

В вашей запрос в базу это побочный эффект, такое лучше делать в контроллере, а во вью передавать данные.

Но на самом деле ваш код еще и антипаттерн, так называемая проблема `select N + 1`. Запросы в цикле - зло. Вы не пользуетесь ни базой данных, ни взможностями вашей ORM (если это она).
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Ошибка в том, что $model->relUsers это должна быть связь возвращающая массив моделей. И тогда все будет отлично:
<?php foreach ($model->relUsers as $t) : ?>
        <span><?= $t->username ?></span>
<?php endforeach; ?>

Так что подозреваю, что имеет место ошибка архитектуры. Вы храните список id в строке, а под это должна быть отдельная таблица:
id | model_id | user_id
и связь hasMany в модели с моделями пользователей, через эту базу.
Ответ написан
Нормально если это необходимо, например тот же twig он разрешает добавление пользовательских функций.

В вашем примере я бы просто подготовил нужный массив и вывел его
Ответ написан
Комментировать
mitaichik
@mitaichik
Правильно будет сделать релейшен, что то типа $task->executors

Наверняка вы используете промежуточную таблицу (я так понял что relUsers - это она). В таком случае релейшн нужно делать с помощью метода via.

А релейшены для промежуточных таблиц (relUsers) я бы не стал делать, так как это чисто техническая необходимость для связи этих двух сущностей в реляционных баз данных.
Ответ написан
Комментировать
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
Наборы элементов готовятся в контроллере и передаются во вью, где только итерируются.
<?php foreach ($model->relUsers as $t) : ?>
        <span><?= User::getById($t,'name') ?></span>
<?php endforeach; ?>

Тут, помимо того что у вас запросы идут прямо по ходу вывода контента(привет из 2000), так еще и вместо одного запроса выбора пользователей вы выбираете их по одному, КАЖДОГО, КАРЛ! А если на страничке 300 пользователей(или 3000) это вообще не гуд. Для этого есть коллекции.
Ответ написан
Комментировать
Urichalex
@Urichalex
Кратко о себе)
View - для того и называется view (отображение), что должно только отображать.
Получать данные нужно в контроллере.
Максмсум, что можно в представлении - условия, типа если массив с данными пуст, вывести ошибку, иначе данные
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы