2010-10-14 128 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主机名不使用我想,但必须满足一些断言),然后设置它的适配器。这两个步骤显然可以通过包装函数来执行。