Как правильно получать данные из БД в стиле 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]);
	}
}
  • Вопрос задан
  • 2713 просмотров
Решения вопроса 3
@mr_ko
Javascript, Node.js. React.js, Vue.js, Wordpress
Вот есть хорошая CMS написанная на Yii www.yupe.ru/. Установите себе и смотрите как там решают подобные задачи.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Откройте для себя такие вещи как "тонкие контроллеры" и "сервис-ориентированная архитектура".
Ответ написан
anton_slim
@anton_slim
web разработчик
По мне, лучше использовать отдельные модели независимые ни от ActiveRedord ни от mysql и чего-либо другого.
Это позволит внедрить свой определенный формат запроса к модели независимо от того какая БД используется.

К примеру решил ты перейти на другую базу, например redis, тогда тебе придется переписывать все контроллеры.
А так тебе достаточно будет переделать модель usersModel под новую БД и вуаля все будет работать.
Твои контроллеры не должны знать как и откуда модель получает данные, но контроллеры должны знать четко в каком формате передавать в модель параметры.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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