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;
    }
}
4

2 回答 2

3

这一切都取决于,你想做什么。

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

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

另外,请参阅此博客文章:

使用 Action Helpers 实现可重用的小部件 - phly, boy, phly

于 2010-10-14T17:34:55.973 回答
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)您需要构造客户端(api.local我认为不使用主机名,但需要满足某些断言)而不是 Kohana 的,然后设置其适配器。这两个步骤显然可以由包装函数执行。

于 2011-04-24T17:55:19.677 回答