Zend框架中的HMVC

时间:2010-10-14 13:58:09

标签: php zend-framework hmvc

是否可以在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;
    }
}

2 个答案:

答案 0 :(得分:3)

这完全取决于你想做什么。

动作堆栈或操作视图帮助程序可能会为您完成工作,但这可能不是最佳解决方案,因为调度开销(可能会在ZF2中删除)。

第二种方法是直接调用控制器中的模型和操作的视图助手。您可以使用动作助手(以及对它们的静态调用)来访问控制器逻辑。

另外,请参阅此博文:

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

答案 1 :(得分:0)

由于Kohana的HMVC模式最终会为您提供一种在内部为HTTP请求提供服务的方法,因此您可以创建一个执行相同操作的适配器Zend_Http_Client。我写了一些概念代码证明来做这件事;见zend-http-client-adapter-internal

HelloController调用IndexController的示例:

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

}

正如您所看到的,您需要构建客户端(我认为不使用Request::factory($url)主机名,而是满足某些断言所必需的),而不是Kohana的api.local,然后设置其适配器。这两个步骤显然可以通过包装函数来执行。