【问题标题】:HMVC in Zend FrameworkZend 框架中的 HMVC
【发布时间】:2010-10-14 13:58:09
【问题描述】:

是否可以在 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 视图助手framework.zend.com/manual/en/zend.view.helpers.html 它允许您从视图中调用控制器并进行交互,但我不是 HMVC 专家 :)
  • 我想将 controller_actions 包含在其他页面中,但也作为主页。据我所知,这对于助手来说是不可能的(除非你想把它弄脏)。
  • 我对 HMVC 不是很熟悉,但是操作堆栈在本质上是不是效率不高?这可能很有趣:stackoverflow.com/questions/1558909/…

标签: php zend-framework hmvc


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我担心这还不够。看我原帖的修改
  • @Stegeman:我没有看过 Kohana 的实现,但是 ZF Action 堆栈是你想要的。但是应该避免(已经讨论过原因),我发布的解决方案是操作堆栈的推荐替代品。
  • 我试了一下,但没能成功。对此发起了另一个威胁:stackoverflow.com/questions/3979234/…
  • 如果我理解正确,我无法决定要显示哪个“小部件”的页面级别?
  • @Stageman 您需要检查请求以确定模块/控制器/操作或 url 并根据它添加条件,是否显示小部件(这通常在控制器插件中也有)。
【解决方案2】:

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

}

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

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多