Правильный способ обхода массивов в шаблоне MVC - PullRequest
0 голосов
/ 10 ноября 2011

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

Вв тот момент, когда я планировал сделать что-то подобное, но теперь я смотрю на это и вижу очень много вещей, которые, как мне кажется, должны быть в модели:

Мой контроллер выглядит так:

public function category_list() {

  foreach ($this->CategoryModel->getCategoryList() as $cat) {           

    $data['cat_title'] = $cat['category_title'];        
    $data['list']['stores'] = $this->StoresModel->getStoresByCategory($cat['category_id']); 
    $this->_Load->view('stores_by_category.tpl', $data);

  }

}

Это правильный путь к решению этой задачи или мое чувство вины правильное?

Большое спасибо

Ответы [ 5 ]

2 голосов
/ 10 ноября 2011

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

1 голос
/ 10 ноября 2011

Хорошо:

Вы используете контроллер для заполнения данных, которые будут использоваться в представлении.Вы делаете модельный вызов getCategoryList () по сравнению с собственным sql и т. Д.

Плохое:

Обертывание вызова шаблона в цикле.Вам следует локализовать строки из getCategoryList () в $ data, как вы делаете, но затем вызвать шаблон один раз, с массивом $ data, тогда ваш шаблон будет перебирать $ data.

Указатели:

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

1 голос
/ 10 ноября 2011

Я не понимаю, почему экземпляр CategoryModel должен позаботиться о получении списка категорий.Модель хранит данные о одной записи в вашей базе данных.То, что вы пытаетесь сделать, должно быть помещено в класс репозитория модели.Хранилище заботится о получении записей из базы данных.Итак, у вас должно быть два класса: CategoryModel и CategoryRepository.

То же самое относится к классу StoresModel.Кроме того, магазины категории должны быть доступны через экземпляр CategoryModel, например: $category->getStores().Свойство stores должно быть установлено вашим ORM.

Кроме того, вы не должны внедрять модели в свои контроллеры (но я считаю, что вы делаете это, потому что вы используете модели, как если бы они были репозиториями).

1 голос
/ 10 ноября 2011

Вы правы, что хотите избежать Fat Controller, за исключением двигателя Томаса Танка, которого вы никогда не захотите видеть этим парнем.:))

В этом конкретном случае я бы предпочел считать ваш код презентационным, и, следовательно, его лучше всего разместить в представлении.Помните, что модели не должны ничего знать о том, как они используются.По этой причине я лично был бы склонен присвоить $this->CategoryModel->getCategoryList() переменной представления и сделать так, чтобы представление реализовало цикл foreach.

0 голосов
/ 10 ноября 2011

Ваш код выглядит нормально, но если вы действительно хотите, чтобы ваш контроллер ONLY связывал данные между моделями и представлениями, в модели должен быть выполнен цикл foreach (), и ваш код должен выглядеть примерно так:

/* controller side */
public function category_list()
{
    $this->_Load->view('stores_by_category.tpl', $this->StoresModel->getFormattedCategoryList());
}

/* model side */
public function getFormattedCategoryList()
{
    $data = Array();

    foreach ($this->getCategoryList() as $cat)
    {           
        $data['cat_title'] = $cat['category_title'];
        $data['list']['stores'] = $this->getStoresByCategory($cat['category_id']);
    }

    return $data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...