zend-framework - Zend Framework 中的胖模型瘦 Controller

标签 zend-framework

我的应用程序中的 Controller 很少,它们在 Controller 中使用了太多的业务逻辑。例如看看这个操作方法

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

引用上述操作方法,格式化数据的逻辑是在 Controller 本身中处理的。我在同一个 Controller 中有几种这种方法,导致我的 Controller 变得很胖。而许多经验丰富的人都同意让 Controller 尽可能瘦。我想问一下,我是否应该将上述方法的所有业务逻辑移至相应的模型中,还是按照当前流程进行即可?

更新:

引用上面的代码,我将所有业务逻辑放置在我的模型中

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

在 Controller 中

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

这是正确的方法吗?还是我做错了?

最佳答案

既然您从模型 (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。

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

关于zend-framework - Zend Framework 中的胖模型瘦 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10231346/

相关文章:

php - fatal error :未捕获的异常 'Zend_Session_Exception' 带有消息“Zend_Session::start()”

zend-framework - 如何在 session 期间从 Zend application.ini 文件中检索参数?

zend-framework - View 助手的问题

php - 使用 Zend_Db_Select 选择 '0' AS 变量 ...

php - 在 Zend 中使用 BaseController 扩展 IndexController

php - Doctrine ODM MongoDB - 复制带有约束的简单一对多引用

php - 如何使用 Zend_Mail、sendmail 和 localhost 发送电子邮件?

zend-framework - Zend 框架重定向器无法正常工作

php - 如何在 Zend-Framework 中创建或执行 MySQL 过程?