#php #mysql #codeigniter
#php #mysql #codeigniter
Вопрос:
Я задавался вопросом, какова наилучшая практика кодирования при работе с настройкой Model-View-Controller при использовании запросов к базе данных. Должен ли я передать возвращенный запрос контроллеру, вот так…
Контроллер
$query = $this->db->get();
$this->template->write_view('content', 'work/index', array('work_query' => $query));
$this->template->render();
Вид
<?php if ($work_query->num_rows() == 0): ?>
<p>There are no works</p>
<?php else: ?>
<?php foreach($work_query->result() as $work): ?>
//Do something
<?php endforeach; ?>
<?php endif; ?>
Или я должен вызвать какую-либо функцию из класса запросов (например result_array()
) и передать ее в представление.
Контроллер
$query = $this->db->get()->result_array();
$this->template->write_view('content', 'work/index', array('works' => $query));
$this->template->render();
Вид
<?php if (empty($works)): ?>
<p>There are no works</p>
<?php else: ?>
<?php foreach($works as $work): ?>
//Do something
<?php endforeach; ?>
<?php endif; ?>
Считается ли один из них лучшим стандартом кодирования? Является ли один из них более эффективным, чем другой?
Комментарии:
1. Ничто из этого никоим образом не связано с шаблоном проектирования MVC.
Ответ №1:
Как уже сказал пинадельсай, логика подсказывает поместить ваш запрос внутри модели. Этот сервер преследует 2 цели: 1) поддерживать более строгую и качественную практику кодирования, разделяя три логики на MVC; 2) поддерживать упорядоченный код и упростить обслуживание в тот день, когда вы захотите внести некоторые изменения в свой запрос.
Похоже, что вы вызываете запрос только в одном отображаемом представлении, но что, если вы вызываете его более одного раза и однажды решите изменить его? Вам нужно будет проверить все представления и внести изменения в каждое из них; сохраняя логику внутри модели, вы просто меняете один метод и отправляете исправленные результаты сразу во все представления.
Небольшое дополнение и небольшой совет: вам не обязательно вызывать функцию, возвращающую массив, чтобы получить результаты в виде массива. Делаем что-то вроде (в вашей модели):
$query = $this->db->get('mytable'); // this is your fetching;
$data = array();
foreach($query->result() as $row)
{
$data[] = $row;
}
return $data;
У вас будут свойства, которые всегда находятся в форме массива ($ data), независимо от того, решите ли вы использовать result(), а затем измените его на result_array(); ваше представление сохранит ту же логику foreach, вам просто нужно будет изменить способ вызова значений (используя нотацию массива или объектную нотацию).
Обновить:
согласно вашему комментарию, вы можете использовать другое представление, когда у вас нет результатов (но это сильно зависит от вашего дизайна. Чаще всего вы позволяете модели передавать вместе со своими данными информацию о количестве результатов. Например:
$query = $this->db->get('mytable'); // this is your fetching;
$data = array();
if($query->num_rows() > 0)
{
foreach($query->result() as $row)
{
$data[] = $row;
}
}
return $data;
В этом случае $data
начинается как пустой массив. Если строки возвращаются, массив заполнен, в противном случае возвращается пустым, как есть. И затем вы решаете в своем представлении (или в нашем контроллере, если вам нужно загрузить совершенно другое представление в случае), как дифференцировать это условие, выполняя то, что вы уже делаете в своем коде.
Помимо всего этого, нет никакого принудительного закона, который вам нужно принудить. Вы можете поместить любую логику, которую хотите, в свой view, и CI, тем не менее, будет работать. Строгое разделение бизнес-логики, манипулирования данными и отображения данных просто гарантирует, что ваше приложение будет намного более управляемым в будущем; даже если вы будете единственным, кто поддерживает ваш код, я почти уверен, что через шесть месяцев, когда вы вернетесь к этим представлениям, содержащим запрос, вы будете проклинать себя за то, что не сделали «правильный» способ MVC.
Комментарии:
1. Спасибо! Тогда я должен создать другое представление, когда я не получу результатов? Таким образом, вся логика будет в моем контроллере?
2. Ну, нет, ваше представление выглядит нормально; Я обновлю свой код, дайте мне минуту
Ответ №2:
Лучше не передавать запрос в вашем представлении. Простая практика и основная концепция архитектуры MVC заключается в разделении контроллера (логика) — Модели (код, лежащий в основе / манипулирование данными) — Представления (шаблоны).
Рекомендуется передать ваш полный набор результатов в виде массива в представление. Вы можете передать свой запрос для просмотра, НО в редких / специфических случаях. [например, вам нужны некоторые данные в нижнем колонтитуле для этого случая, вызовите запрос модели в представлении, чтобы вам не приходилось отображать запрос модели в каждой функции контроллера и передавать его в представление.]
Надеюсь, здесь я прояснил основную мысль.
Спасибо.