У меня в моем приложении несколько контроллеров, которые используют слишком много бизнес-логики в контроллерах. иметь, например, посмотреть на этот метод действия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());
}
}
это правильный подход. или я делаю неправильный путь?
Благодарим вас за то, что вы выбрали :), если я пойду своим путем, это приведет к созданию нескольких помощников вида, поскольку у меня есть много подобных методов действий, которым нужна обработка данных для iResult. и каждая переменная iResult отличается по содержанию и размеру. не так ли приятно, если я делаю это непосредственно в модели? –
Я обновляю пример того, как я поместил код в модель и назвал одну строку кода в контроллере. поэтому теперь моя бизнес-логика сидит в модели, а не в контроллере. сообщите мне, если я делаю это неправильно или его можно улучшить. –
Несколько помощников в представлении, безусловно, плохая идея, опция должна принимать во внимание только в том случае, если код может быть дублирован. Ваш новый контроллер действий звучит хорошо! И имеет смысл переместить все в модель. Отличная работа. Последнее, рассмотрим использование AjaxContext с json;), что сделало бы ваше действие даже скиннером. – Liyali