2012-04-19 66 views
2

我有我的應用程序,它使用了太多的商業邏輯在控制器內的幾個控制器。例如看看這個動作方法脂肪模型瘦控制器在Zend框架

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

是正確的做法。或者我做錯了什麼?

回答

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()是您的視圖助手的名稱。

+0

感謝您:)下降,如果我走你的路會導致成多個視圖助手被創建,因爲我有很多類似的操作方法,其需要的數據操作的iResult。並且每個iResult變量的內容和大小都不相同。如果我直接在模型中完成它不是很好嗎? – 2012-04-19 15:49:15

+0

我正在更新我如何將代碼放在模型中並在控制器中調用一行代碼的示例。所以現在我的商業邏輯處於模型而不是控制器。讓我知道如果我做錯了,或者可以改進。在絕對是一個壞主意 – 2012-04-19 15:51:36

+0

多視圖助手,該選項是考慮到只有在代碼可以是重複的。你的新動作控制器聽起來不錯!把所有東西都移到模型上更有意義。做得好。最後一件事,考慮與json使用AjaxContext;),這將使你的行動甚至skinner。 – Liyali 2012-04-19 16:00:30