是否可以在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;
}
}
答案 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
,然后设置其适配器。这两个步骤显然可以通过包装函数来执行。