Обработка запросов mysql в php mvc

#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

Я надеюсь, что это поможет.