2010-10-14 46 views
4

Zend Framework中可以使用HMVC模式嗎?它在默認情況下在Kohana 3中實現,我真的很喜歡它,所以現在我想在Zend Framework中使用它。Zend Framework中的HMVC

編輯

我想使它能夠: 1)包括一個完整的請求(如控制器/動作)的其他請求 2)使至所述控制器的直接調用內部/如上動作

它不僅用於小部件,但我也想建立包含其他頁面的內容的網頁...

編輯2

要更清楚一點: 我確實有一個包含多個元素的頁面對象。這些元素可以是簡單元素(文本,圖像等)和特殊元素,即控制器:動作調用。每個頁面可以包含「無限」(特殊)元素。我只是想循環這些元素,定義我正在處理的元素的類型,並將該元素的結果添加到我的視圖的內容中。

像:

foreach($Page->Elements AS $Element) { 
    switch(get_class($Element)) { 
     case "Base\TextElement": 
      // Add text element to content 
      ... 
      break; 
    case "Base\SpecialElement": 
      // Get result of the controller:action call 
      break; 
     case "Base\ImageElement": 
      // Add image element to content 
      ... 
      break; 
     default: 
      echo "No case defined for ".get_class($Element); 
      die; 
    } 
} 
+0

在某種程度上,您可以使用zend視圖助手http://framework.zend.com/manual/en/zend.view.helpers.html它允許您從視圖調用控制器並進行交互,但我不是HMVC的專家:) – Hannes 2010-10-14 14:03:29

+0

我想將controller_actions包含在其他頁面中,但也作爲主頁面。據我所知,這對助手來說是不可能的(除非你想把它弄髒)。 – 2010-10-14 14:11:37

+0

我對HMVC並不熟悉,但是沒有太多的效率,動作堆棧基本上沒有那麼做?這可能是有趣的:http:// stackoverflow。com/questions/1558909/best-approach-to-render-site-wide-elements-using-zend-framework – 2010-10-14 14:17:10

回答

3

這一切都取決於,你要怎樣做。

可能是操作堆棧或操作視圖助手會爲你做這項工作,但這可能不是最好的解決方案,因爲調度開銷(可能會在ZF2中被刪除)。

第二種方法是視圖助手直接調用控制器中的模型和動作。您可以使用動作助手(以及對它們的靜態調用)來訪問控制器邏輯。

而且,看到這篇博客文章:

Using Action Helpers To Implement Re-Usable Widgets - phly, boy, phly

+0

我很擔心這是不夠的。看看我原來發布的修改 – 2010-10-19 09:15:54

+0

@Stegeman:我沒有看過Kohana的實現,但是在ZF Action Stack中是你想要的。但是應該避免(已經討論過爲什麼),我發佈的解決方案是推薦替代操作堆棧。 – takeshin 2010-10-19 20:51:54

+0

我試了一下,但沒有設法讓它工作。開始對它的其他威脅:http://stackoverflow.com/questions/3979234/zend-framework-widget-tutorial-question – 2010-10-20 14:59:34

0

因爲什麼Kohana中的HMVC格局最終的確是給你內部HTTP請求提供服務的方式,你可以創建一個適配器Zend_Http_Client,做同樣的事情。我寫了一些概念代碼證明來做一次這樣的事情;見zend-http-client-adapter-internal

調用HelloControllerIndexController的例子:

class IndexController extends Zend_Controller_Action 
{ 

    public function indexAction() 
    { 
     $client = new Zend_Http_Client("http://api.local/hello/?name=Clem"); 

     $client->setAdapter(new Http_Client_Adapter_Internal(
      $this->getFrontController() 
     )); 

     $response = $client->request(); 
     echo $response->getBody(); 
    } 

} 

正如你所看到的,而不是Kohana中的Request::factory($url),您需要構建客戶端(api.local主機名不使用我想,但必須滿足一些斷言),然後設置它的適配器。這兩個步驟顯然可以通過包裝函數來執行。