Куда относятся SQL-запросы в проекте MVC?

На прошлой неделе я читал книгу о MVC и общую книгу о шаблонах проектирования, но я все еще не уверен, где в моем коде находятся SQL-запросы: модель или контроллер?

Давайте рассмотрим очень простой пример, когда у вас есть / популярная страница, которая напечатает 5 самых популярных историй на веб-сайте.

В вашей модели у вас будет класс для подготовленных этапов и класс для помощи в создании запроса SELECT. По вашему мнению, у вас есть элементы HTML, которые отображают / популярную страницу.

Куда относится запрос «ВЫБЕРИТЕ наиболее популярные истории LIMIT 5»? Это то, о чем должен спрашивать класс контроллера, беря методы запроса из модели и передавая их представлению, или вместо этого следует объявить запрос в классе модели, связанном со страницей / Popular?

Это различие даже уместно? Будет ли размещение этого запроса на контроллере или модели рассматриваться как профессиональные способы создания MVC?

Спасибо. Кажется, что большинство людей застревают, понимая, что разместить на контроллерах

Редактировать: спасибо за помощь всем. К сожалению, как новый аккаунт, я не могу пока проголосовать за полезные посты

0

Решение

Обычно (исходя из моего опыта работы со средами MVC) уровень модели заботится о вещах, связанных с базой данных в MVC.

Рассмотрим следующий подход:

  1. Создать абстрактный класс, который охватывает все операции с БД (выборки, обновления и т. Д.). Каждая таблица будет классом PHP, расширяющим такой класс. Затем вы можете определить имя таблицы БД, например, в закрытом поле, в конструкторе или в зависимости от имени модели.
  2. Каждый контроллер (или отдельный контроллер) будет загружать нужную модель и использовать ее методы для извлечения данных в виде ассоциативных массивов или объектов, удаления данных, их изменения.
  3. После выполнения всех операций с БД контроллер возвращает представление и передает данные в качестве своих параметров.

Обратите внимание, что модели являются отличным местом для размещения всех правил проверки и некоторых вспомогательных методов из-за того, что их можно легко протестировать в PHPUnit.

-1

Другие решения

Вот очень минималистичный пример того, как это будет работать.

// Model.php

<?php

class Model
{

public function __construct(Database $db){
$this->db = $db;
}

public function getPosts() {
$this->db->query("YOUR SQL QUERY HERE");
return $this->db->single();
}
}

// Controller.php

<?php

class Controller
{
public function __construct() {
$this->model = new Model($dbh);
}

public function postsPage() {
$posts = $this->model->getPosts();
// TODO: render posts
}
}

По сути, вы создаете экземпляр базы данных в контроллере, чтобы вы могли внедрить ее в любые модели, которые вы используете. Обработчик базы данных может быть классом, который вы делаете ( <- Я рекомендую это) или просто обработчик PDO. Таким образом, в целом, контроллер будет запрашивать информацию для модели, и контроллер будет вызывать класс представления для соответствующей визуализации.

-1

По вопросам рекламы [email protected]