Zend framework Zend框架中的胖模型瘦控制器

Zend framework Zend框架中的胖模型瘦控制器,zend-framework,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',

我的应用程序中几乎没有控制器,在控制器中使用了太多的业务逻辑。例如,看看这个动作方法

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

这是正确的方法吗。还是我做得不对?

既然您从模型(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()
是视图帮助程序的名称。

感谢您的参与:),如果我按您的方式操作,将创建多个视图帮助程序,因为我有许多类似的操作方法,需要对iResult进行数据处理。每个iResult变量的内容和大小都不同。如果我直接在模型中这样做不是很好吗?我正在更新示例,介绍如何将代码放置在模型中,并调用控制器中的一行代码。所以,现在我的业务逻辑位于模型中,而不是控制器中。如果我做得不对或者可以改进,请告诉我。多视图帮助器绝对不是一个好主意,只有在代码可以重复时才考虑这个选项。你的新动作控制器听起来不错!将所有内容移动到模型中会更有意义。干得好最后,考虑使用JSON的Ajax上下文;那会让你的行动更具吸引力。谢谢你@Liyali。我是zend框架的初学者,坦率地说,到目前为止,我还没有使用AjaxContent,这是我第一次从您那里听到关于它的消息。如果您能提供一些我可以参考代码使用的快速示例,我将不胜感激。:)当然,我已经写好了,看一看。您还可以找到有关它的更多信息。在您的情况下,您的操作将只包含:
$item=newmodel_item()
$this->view->aaData=$item->getPublishedItem()
使用此技术。
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);
    }
}
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);
    }
}