Вывод значений из БД в шаблон HTML PHP

166
30 декабря 2019, 14:20

Вопрос банальный, но тем не менее меня интересует как правильно это делается.
Пишу на Yii2 приложение, есть страница с информацией по автомобилю, в которой выводятся поля из соответствующей таблицы в БД, например:

id | type | model | mark | color
 1 | 1    | v4    | VW   | green
...
$auto = Auto::findOne($id);
...
$this->render('auto', ['auto' => $auto]);

где type: 0 - седан, 1 - хэтчбэк и т.д., остальное, думаю, понятно.
Соответственно в HTML это выводится в таком виде:

...
<ul>
<li> <?= $auto->type ?> </li>
<li> <?= $auto->model ?> </li>
<li> <?= $auto->mark ?> </li>
<li> <?= $auto->color ?> </li>
</ul>
...

Такие поля как model и mark можно отдавать в таком виде, в каком они хранятся в БД, а как правильно отдавать поля вроде type и color?
Мне на ум приходит какой-нибудь класс-хелпер специально для приложения со статическими функциями, в одну из которых передается соответствующее поле, а на выходе оно преобразует в нужный вид, например:

class AutoHelper
{
    public static function getAutoType($type)
    {
        switch ($type) {
            case 0:
                return 'Седан';
            case 1:
                return 'Хэтчбэк';
            default:
                return 'Не определено';
        }
    }
    ...
}

Но смущает, что многие говорят, что классы хелперы - зло, нарушают принцип единой ответственности и многое прочее страшное, за что готовы отрывать руки. И это я еще не беру пример, когда при определенном значении из БД нужно выводить значение зеленым или красным цветом или преобразовывать цену из рублей в доллары и т.д. Так какой правильный путь?

Answer 1

За отображение объектов типа Авто в HTML отвечает АвтоОтображатель (маппер). Такой объект может содержать довольно сложную логику отображения. Например для английской версии сайта типы лучше выводить по-английски, для HTML надо не забыть экранировать данные, большие тексты может потребоваться обрезать до какой-то длины.

Реализовать такое можно, например, как декоратор или завести специальный тип объекта для отображения, в который мапить исходный объект.

Ваш хелпер вполне себе такой маппер, только очень простой. Пока вариантов отображения не много, можно оставить всё как есть. Или можно было бы запихнуть пару таких методов в модель ($auto->getTypeString()). Можно создать отдельные модели Тип и Цвет ($auto->type->getName()). Но когда логики станет побольше, имеет смысл перетащить всё это в отдельный класс и в шаблоне уже работать с подготовленными данными.

Подход с маппером более гибкий, но добавляет лишний слой абстракции. Если игра стоит свеч, используйте его, но на старте можно обойтись и хелперами (даже если кому-то кажется, что руки надо отрывать).

Answer 2

Вам нужно создать таблицы, в которых хранятся значения type и color. Затем создать соответствующие модели и прописать отношения между ними. После этого можно будет спокойно выводить нужные значения при помощи штатного функционала из коробки.

Пример реализации для вывода в GridView можно найти здесь.

READ ALSO
std::map и класс с конструктором копирования

std::map и класс с конструктором копирования

Почему данный код, пытающийся запихнуть пару - int и класс с конструктором копирования, не работает?

149
как правильно создать CMake проект без qt в QtCreator?

как правильно создать CMake проект без qt в QtCreator?

пытаюсь использовать qtCreator как IDE для C++ с использованием CMake для создания проекта прохожу типичную процедуру: проект без qt -> приложение на языке...

172
matrix_transformer

matrix_transformer

В boost::geometry есть алгоритм transform, который, используя различные стратегии, позволяет производить афинные преобразованияМеня интересует использование...

145
Как провильно работать с boost::geometry::index::rtree

Как провильно работать с boost::geometry::index::rtree

Меня интересует можно ли изменять значения в деревеК примеру, у меня есть дерево, содержащее пары прямоугольников и некоторый объект - могу...

129