MVC: Может ли представление просмотреть результаты запроса? - PullRequest
4 голосов
/ 10 июля 2009

Я новичок в MVC. Вы были предупреждены ...

У меня есть модель User, которая может возвращать ресурс результата MySQL в контроллер. Контроллер передает ресурс MySQL представлению для отображения. Допустимо ли выводить результаты запроса в представлении, используя функцию извлечения результатов из базы данных?

<?php while($row = some_fetching_function($database_result_resource): ?>
<tr>
   <td><?=$row['Username']?></td>
   ...etc
</tr>
<?php endwhile; ?>

Мне это не подходит. Это тесно связано, верно? Модель должна возвращать некоторый тип ресурса базы данных, и представление должно проходить через него, используя некоторый тип метода извлечения базы данных. Это можно отделить, не просматривая результаты дважды? Я думаю, вам нужно было бы пройтись по результатам в модели, чтобы создать массив результатов, а затем снова в представлении.

В итоге:

  1. Может ли представление отображать ресурс результатов базы данных, придерживаясь шаблона проектирования MVC?
  2. Можно ли избежать циклического повторения данных дважды, избегая при этом тесной связи с базой данных?

Ответы [ 4 ]

6 голосов
/ 10 июля 2009

Если вы абстрагируете часть кода базы данных, я думаю, что это приемлемо. Например, вы можете предоставить «набор строк», который можно повторять (реализовать интерфейс Iterable или что-то в этом роде). За кулисами этот объект может содержать результат базы данных и использовать функцию извлечения.

По сути, идея заключается в том, что ваше представление имеет дело с универсальным набором строк, который не подразумевает, что оно исходит из базы данных или любого другого источника, и таким образом вы уменьшаете связь.

2 голосов
/ 10 июля 2009

Конечно может. Но на самом деле вы не должны получать строки в вашем представлении. Сделайте Назначение данных модели в вашем контроллере, но не непосредственно в представлении. Как отметил Hooray Im Helping, выборка данных зависит от используемой вами модели. Но у вас не должно быть каких-либо специфичных для базы данных методов или логики модели. Если модель реализует общий интерфейс Iterator , вы можете передать его непосредственно в представление.

<?php
public function someControllerAction($params)
{
    $myModel = Model::getModel('Model Name');
    // But you don't do Model::getModel('Model Name')->getResults($params['date']) in your viewa
    $this->view->rows = $myModel->getResults($params['date']);
}
?>
0 голосов
/ 10 июля 2009

Я думаю, что лучший способ - абстрагировать результаты запроса SQL в список объектов и вернуть список.

Я не думаю, что итерация набора строк отделяет представление от конкретной базы данных, которую вы используете. Представление должно быть независимым от используемого подключения к базе данных. Если вы решили использовать JDBC или hibernate или что-то еще, переход не должен требовать изменений в представлении.

0 голосов
/ 10 июля 2009

Как сказал Джани, вам, вероятно, следует обернуть результаты MySQL в класс, который реализует интерфейс Iterable из стандартной библиотеки PHP. Таким образом, ваше представление может использовать знакомую и универсальную конструкцию foreach, при этом не нужно дважды повторять результаты, чтобы поместить их в массив.

SPL

class rswrap implements Iterator
{
    var $rs;
    var $current;

    function __construct($rs)
    {
        $this->rs = $rs;
    }

    function rewind()
    {
        // do nothing
    }

    function next()
    {
        $this->current = some_fetching_function($this->rs);
    }

    function current()
    {
        return $this->current;
    }

    function valid()
    {
        return $this->current !== false;
    }

    function key()
    {
        return 0; // usually sufficient but you may want to write a real key function.
    }
}

$resultset = new rswrap($database_result_resource);

foreach($resultset as $row)
{
    // your code here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...