#php #model-view-controller
#php #model-view-controller
Вопрос:
Я работаю над приложением, написанным на PHP. Я решил следовать архитектуре MVC. Однако, по мере того, как код становится все больше и больше, я понял, что в некоторых случаях некоторый код дублируется. Кроме того, я все еще не понимаю, следует ли мне использовать статические функции при запросе базы данных или нет.
Давайте рассмотрим пример того, как я это делаю :
class User {
private id;
private name;
private age;
}
Теперь внутри этого класса я напишу методы, которые работают с одним экземпляром пользователя (операции CRUD). С другой стороны, я добавил общие статические функции для работы с несколькими пользователями, например :
public static function getUsers()
Основная проблема, с которой я сталкиваюсь, заключается в том, что мне приходится обращаться к полям через результаты, когда мне нужно перебирать пользователей в моих представлениях. например :
$users = User::getUsers();
// View
foreach($users as $user) {
echo $user['firstname'];
echo $user['lastname'];
}
Я решил сделать это, потому что я не чувствовал необходимости создавать единый пользовательский экземпляр для всех пользователей, просто чтобы выполнить простую обработку данных, например, отобразить их информацию. Но что, если я изменю имена полей таблицы? Я должен просмотреть весь код и изменить эти поля, и это то, что меня беспокоит.
Итак, мой вопрос в том, как вы справляетесь с подобными запросами к базе данных, и можно ли использовать статические функции при запросе базы данных. И, наконец, где логично хранить эти «отображающие» функции, подобные той, о которой я говорил?
Ответ №1:
Ваш подход кажется прекрасным, однако я бы все равно использовал кэширование, например memcached
, для кэширования значений, а затем вы можете удалить static.
public function getUsers() {
$users = $cacheObj->get('all_users');
if ($users === false) {
//use your query to grab users and set it to cache
$users = "FROM QUERY";
$cacheObj->set('all_users', $users);
}
return $users;
}
Комментарии:
1. Можете ли вы подробнее рассказать о том, как работает $cacheObj-> get(‘all_users’) ? Или вы можете предложить статью, в которой рассматривается этот метод кэширования?
Ответ №2:
(M) odel (V) iew (C) ontroller — отличный выбор, но мой совет — посмотрите на использование фреймворка. Минус в том, что у них может быть пошаговая кривая обучения, плюс в том, что это требует много тяжелой работы. Но если вы хотите вести честную игру самостоятельно, сделать это самостоятельно может быть непросто.
С точки зрения местоположения у вас есть выбор, потому что модель четко не определена: вы услышите используемый термин «бизнес-логика», в основном в модели есть все, что касается представлений и контроллеров. Контроллеры должны быть бережливыми, только перемещая данные, а затем возвращая их в представление.
Вы моделируете взаимодействие домов с БД, преобразования данных, изменения часовых поясов, общие повседневные функции.
Moudle /User /Model /DB или (Сущности и картограф) / Утилиты
Я использую Zend, и он использует табличные шлюзы для стандартного CRUD, чтобы избежать повторения.
Там, где у вас есть метод getUsers(), вы просто передаете ему массив, и он становится действительно многоразовым, и у вас просто будут разные массивы в разных действиях контроллера, и он строит запросы для вас из информации о массиве.
Пример:
$data = array ('id' => 26)
$userMapper->getUsers($data);
чтобы получить пользователя 26
enter code here
$data = array ('active' => 1, 'name' => 'Darren')
$userMapper->getUsers($data);`
чтобы получить активных пользователей с именем Darren
Я надеюсь, что это поможет.