2012-04-19 3 views
2

У меня в моем приложении несколько контроллеров, которые используют слишком много бизнес-логики в контроллерах. иметь, например, посмотреть на этот метод действияFat Models Skinny Controller в Zend Framework

public function publishedAction() 
{ 
    if ($this->getRequest()->isXmlHttpRequest()) { 
     $dataTable = new Model_DataTables('item i', array('i.id', 'i.title', 'i.from_age', 'i.to_age', 'i.gender', 'i.created_at', 'i.ispublished')); 
     $item = new Model_Item(); 
     $output = $dataTable->aaData(); 
     $iResult = $dataTable->iResult(); 
     foreach($iResult as $k => $v) { 
      $id = $iResult[$k][0]; 
      $iResult[$k][0] = date('d-m-Y', strtotime($iResult[$k][5])); 
      $iResult[$k][2] = $item->formatAge($iResult[$k][2], $iResult[$k][3]); 
      $iResult[$k][3] = ($iResult[$k][4] == 1) ? 'Male' : 'Female'; 
      $iResult[$k][4] = "<a href=/admin/item/view/".$id.">View</a>"; 
      $iResult[$k]['DT_RowId'] = "$id"; 
     } 
     $output['aaData'] = $iResult; 
     $this->_helper->json($output); 
    } 
} 

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

Update:

со ссылкой на приведенный выше код я поместил всю бизнес-логику в моей модели

public function getPublishedItem() 
{ 
    $dataTable = new Model_DataTables('item i', array('i.id', 'i.title', 'i.from_age', 'i.to_age', 'i.gender', 'i.created_at', 'i.ispublished')); 
    $output = $dataTable->aaData(); 
    $iResult = $dataTable->iResult(); 
    foreach($iResult as $k => $v) { 
     $id = $iResult[$k][0]; 
     $iResult[$k][0] = date('d-m-Y', strtotime($iResult[$k][5])); 
     $iResult[$k][2] = $this->formatAge($iResult[$k][2], $iResult[$k][3]); 
     $iResult[$k][3] = ($iResult[$k][4] == 1) ? 'Male' : 'Female'; 
     $iResult[$k][4] = "<a href=/admin/item/view/".$id.">View</a>"; 
     $iResult[$k]['DT_RowId'] = $id; 
    } 
    $output['aaData'] = $iResult; 
    return $output; 
} 

и в контроллере

public function publishedAction() 
{ 
    if ($this->getRequest()->isXmlHttpRequest()) { 
     $item = new Model_Item(); 
     $this->_helper->json($item->getPublishedItem()); 
    } 
} 

это правильный подход. или я делаю неправильный путь?

ответ

2

Поскольку вы извлекаться $iResult из модели (Model_DataTables), не было бы лучше просто сделать:

public function publishedAction() 
{ 
    if ($this->getRequest()->isXmlHttpRequest()) { 
     $dataTable = new Model_DataTables('item i', array('i.id', 'i.title', 'i.from_age', 'i.to_age', 'i.gender', 'i.created_at', 'i.ispublished')); 
     $output['aaData'] = $dataTable->getIResult(); 
     $this->_helper->json($output); 
    } 
} 

где getIResult() содержит ваш Еогеасп.

Другим решением было бы использовать помощник вида, поскольку кажется, что вы форматируете содержимое html. Ваше действие будет тогда так:

public function publishedAction() 
{ 
    if ($this->getRequest()->isXmlHttpRequest()) { 
     $dataTable = new Model_DataTables('item i', array('i.id', 'i.title', 'i.from_age', 'i.to_age', 'i.gender', 'i.created_at', 'i.ispublished')); 
     $output['aaData'] = $this->view->formatIResult($dataTable->getIResult()); 
     $this->_helper->json($output); 
    } 
} 

formatIResult(), где это имя вашего зрения помощника.

+0

Благодарим вас за то, что вы выбрали :), если я пойду своим путем, это приведет к созданию нескольких помощников вида, поскольку у меня есть много подобных методов действий, которым нужна обработка данных для iResult. и каждая переменная iResult отличается по содержанию и размеру. не так ли приятно, если я делаю это непосредственно в модели? –

+0

Я обновляю пример того, как я поместил код в модель и назвал одну строку кода в контроллере. поэтому теперь моя бизнес-логика сидит в модели, а не в контроллере. сообщите мне, если я делаю это неправильно или его можно улучшить. –

+0

Несколько помощников в представлении, безусловно, плохая идея, опция должна принимать во внимание только в том случае, если код может быть дублирован. Ваш новый контроллер действий звучит хорошо! И имеет смысл переместить все в модель. Отличная работа. Последнее, рассмотрим использование AjaxContext с json;), что сделало бы ваше действие даже скиннером. – Liyali