Zend框架中的胖模型Skinny控制器

时间:2012-04-19 15:20:56

标签: 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);
    }
}

参考上述动作方法,在控制器本身中处理格式化数据的逻辑。我在同一个控制器中有几个这样的方法导致我的控制器变胖。虽然许多经验丰富的灵魂同意尽可能让控制者保持苗条。我想问一下,如果我在相应的模型中移动上述方法的所有业务逻辑,或者可以使用当前流程吗?

更新

参考上面的代码我将所有业务逻辑放在我的模型中

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());
    }
}

这是正确的方法。或者我做错了吗?

1 个答案:

答案 0 :(得分:2)

由于您从模型(Model_DataTables)中检索了$iResult,因此简单地执行操作会不会更好:

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()包含您的foreach。

另一种解决方案是使用视图助手,因为您似乎在格式化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()是视图助手的名称。