Здравствуйте. Учусь писать качественный гибкий код для многоразового использования.
Задача: Написать метод качественный, гибкий метод по фэн шую для получение пользователей из БД. Фреймворк 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]);
}
}