Zend框架中的HMVC

4

在Zend Framework中使用HMVC模式是可能的吗?Kohana 3默认实现了它,我非常喜欢它,所以现在我想在Zend Framework中使用它。

编辑

我想要实现以下功能: 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;
    }
}

在某种程度上,您可以使用Zend视图助手http://framework.zend.com/manual/en/zend.view.helpers.html,它允许您从视图中调用控制器并进行交互,但我不是HMVC的专家:) - Hannes
我想在其他页面中包含controller_actions,但同时也将其作为主页。据我所知,使用帮助程序是不可能实现这一点的(除非你愿意采用不太合适的方法)。 - Rene Terstegen
我不太熟悉HMVC,但动作堆栈本质上没有多少效率就能做到这一点吗?这可能会有所帮助:http://stackoverflow.com/questions/1558909/best-approach-to-render-site-wide-elements-using-zend-framework - Tim Lytle
2个回答

3
一切都取决于你想要做什么。
可能是 action stack 或 action view helpers 能为你完成工作,但这可能不是最好的解决方案,因为调度开销(可能会在 ZF2 中移除)。
第二个方法是使用视图辅助程序,直接调用模型和控制器中的操作。你可以使用 action helpers (并对它们进行静态调用)来访问控制器逻辑。
此外,请参阅此博客文章: Using Action Helpers To Implement Re-Usable Widgets - phly, boy, phly

我很抱歉,这还不够。请查看我原帖的修改。 - Rene Terstegen
@Stegeman:我没有看过Kohana的实现,但在ZF中,Action stack是你想要的。然而,它应该被避免(已经讨论过原因),我发布的解决方案是Action stack的推荐替代品。 - takeshin
我尝试了一下,但没能让它工作。在这个问题上开了另一个线程:http://stackoverflow.com/questions/3979234/zend-framework-widget-tutorial-question - Rene Terstegen
如果我理解正确的话,我不能在页面级别上决定要显示哪个“小部件”? - Rene Terstegen
@Stageman,您需要检查请求以确定模块/控制器/操作或URL,并根据此添加条件,无论是否显示小部件(这通常也在控制器插件中实践)。 - takeshin

0

Kohana的HMVC模式最终实现的是给你提供了一种在内部服务HTTP请求的方式,因此你可以创建一个适配器Zend_Http_Client来完成同样的事情。我曾经编写过一些概念验证代码来实现这个功能,请参见zend-http-client-adapter-internal

IndexController调用HelloController的示例:

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 主机名,但必须满足某些断言),然后设置其适配器。这两个步骤显然可以由包装函数执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接