Как правильно получать данные из БД в стиле MVC? Здравствуйте. Учусь писать качественный гибкий код для многоразового использования.
Задача: Написать метод качественный, гибкий метод по фэн шую для получение пользователей из БД. Фреймворк Yii.Как лучше?1 вариант: использовать модель ActiveRecord прямо в контроллере
Этот способ мне кажется максимально гибким, он много разовый и гибкий. А вдруг мне нужны будут только активные юзеры и надо будет использовать это в нескольких местах. Предположим, что везде где надо я прописал нужные критерии, но вдруг критерии для поиска активных пользователей сменятся?
Оформить получение активных пользователей в виде скопа или же применить второй вариант метода?
Например:class UsersController extends CController
{
public function actionUsersList()
{
$usersCriteria = new CDbCriteria;
$usersCriteria->addColumnCondition(['nick' => 'PiloT']);
$usersCriteria->addColumnCondition(['city' => 'Киев']);
$users = UsersAR::model()->findAll($usersCriteria);
$this->render('users', ['users' => $users]);
}
}2 вариант: запрещает использовать объект ActiveRecord на прямую, создавая отдельную модель.
Это более правильно? Мне почему-то кажется, что это только лишние проблемы, ведь если всё равно из контроллера вызывается тот же ActiveRecord, только через посредника Users, а вместо скопов используется условие в методе Users::getUsers(). Возможно преимуществом является полный контроль над получаемыми параметрами, но ведь если используется ActiveRecord на прямую, то можно или переопределить метод для контроля параметров или использовать событие beforeFind(), что удобнее и не создаёт проблем.class Users extends CComponent
{
public function getUsers($params = [])
{
$usersCriteria = new CDbCriteria;
if (!empty($params['city'])) {
$usersCriteria->addColumnCondition(['city' => $params['city']]);
}
if (!empty($params['only_active'])) {
$usersCriteria->addCondition('"time_activity" = ' . (time() - 600));
$usersCriteria->addColumnCondition(['ban' => '0']);
$usersCriteria->addColumnCondition(['admin' => '0']);
}
return UsersAr::model()->findAll($usersCriteria);
}
}
class UsersController extends CController
{
public function actionUsersList()
{
$usersModel = new Users;
$users = $usersModel->getUsers(['city' => 'Киев', 'only_active']);
$this->render('users', ['users' => $users]);
}
}

21 Авг 2019 в 07:08
164 +1
1
Ответы
1

Оба способа имеют как свои плюсы, так и минусы.

1 вариант, где вы используете модель ActiveRecord прямо в контроллере, более простой и быстрый способ получения данных из БД. Он удобен в случаях, когда вам нужно реализовать простую логику для получения данных и не планируется многократное использование этой логики в других местах.

2 вариант, где вы создаете отдельную модель для работы с данными из БД, может быть более гибким и модульным подходом. Этот способ позволяет более четко разделить логику работы с данными от контроллера и обеспечивает возможность переиспользования этой логики в других частях приложения.

При выборе между этими двумя вариантами, важно учитывать конкретные требования и особенности вашего проекта. Если вы планируете многократно использовать логику получения пользователей из БД, то создание отдельной модели может быть более предпочтительным вариантом. Если же вам нужно просто быстро получить данные для конкретной страницы или функции, то использование ActiveRecord прямо в контроллере может быть удобнее.

Также рекомендуется обратить внимание на принципы SOLID и принцип разделения ответственности (SRP) при проектировании вашего кода. Эти принципы помогут создать более гибкий и поддерживаемый код.

20 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир