Kohana 中的HMVC:请求工厂–kohana3使用手册
Kohana 3.0 中众多强大特征中的一个就是能在请求流中的任何时候调用另一个请求。这种分层的 MVC 方法允许你组装一个复杂的客户层,真正利用了面向对象的强大优势。
一个最佳的分层结构
■ 减少程序中不同部分之间的依赖
■ 支持代码重用,组件,和模块
■ 增加了扩展性同时减轻了维护
一些在客户端结构上使用到的 HMVC 设计
■ 模块化界面元素或部件
■ 应用和菜单控件
■ 服务器的交互
■ 可重用的应用流
HMVC 基本原理
一种理解 HMVC 的简单方法就是把它认为是没有额外服务器调用的 AJAX。比如,如果你有一个要显示用户列表的 AJAX 动作,你能在其他控制器中重复使用,而不是复制方法。
请求工厂
Kohana 中实现HMVC的办法是使用Request::factory() 方法。使用请求工厂,你能随时使用和完全执行在请求流中的 Kohana 请求。
Request::factory() 方法接受一个路由的URI,并把它作为一个参数。当和 Kohana 强大的路由特征组成时,将会为你建立的应用程序带来完全的扩展性。
在控制器中使用请求工厂
下列示例将为你展示如何在另一个控制器内使用请求工厂。尽管它不能完全突出HMVC强大功能,它能展示如何让两个分开的请求位于同层。
class Controller_Static extends Controller
{
/**
* The following action loads page.
* A sub request is called to load a dynamic menu
*/
public function action_page()
{
$page_name = Request::instance()->param('page');
$this->request->response = View::factory('page/'.$page_name)
->bind('menu', $menu);
$menu = Request::factory('static/menu')->execute()->response;
}
public function action_menu()
{
$page_name = Request::instance()->param('page');
$this->request->response = View::factory('page/menu')
->bind('links', $links);
$links = Kohana::config('menu')->$page_name;
}
}
在视图中使用请求工厂
另一个有效的方法是使用请求工厂来调用一个视图请求。比如下面的例子,我们用视图调用了动态菜单和动态页脚,而不是在控制器中。
<h1><?php echo $page_title ?></h1>
<?php echo Request::factory(‘page/menu’)->execute()->response ?>
<div id=”container”>
<?php echo $content ?>
</div>
<?php echo Request::factory(‘page/menu’)->execute()->response ?>
把请求工厂作为 Kohana 和其他开源项目集成的基础
如果你分析了 Kohana 的 bootstrap.php 文件,你会注意到当 Request::instance 将 Request 类的实例创建之前并没有发生什么神奇的事。
在调用 Request::instance() 和 Request::factory() 之间的唯一区别是 instance()创建了一个唯一的 Request 类,并且它对请求做了一些主要的处理以及输出了一些必要的响应头(header)。
一个重要的注意点是创建一个 Request 的唯一实例或者输出头并不是完全必须的。只要 Kohana 被初始化,仅仅使用 Request::factory() 同样能完全执行性 Kohana 请求。这就是Kohana 如何使用 Kohana-for-Wordpress 插件来整合 WordPress。