HMVC in Kohana:请求工厂模式及应用举例

在Kohana3.0开始引入了一个很强大的功能就是在请求流程中任意调用其他请求。这种MVC分层结构利于你组织一个复杂的客户端和充分利用面向对象的强大功能。
一个最佳的分层结构:

降低项目之间的依赖性

鼓励重用代码,组件和模块

增加可扩展性,减轻可维护性

在客户端使用HMVC分层结构的用途

模块化界面元素或部件

应用和菜单控制

服务器交互

可重复使用的应用流

HMVC基础

一个很容易理解HMVC的方法是就像AJAX没有额外的服务器调用。例如,你用AJAX的动作显示一个用户列表。你可以在其他控制器重用那个动作,而不是重复写这个方法。
Request Factory

可以通过Kohana的Request::factory()的方法实现HMVC。使用Request factory你可以在认识时间请求过程中随意充分执行一个Kohana request。
Request::factory()方法接受RouteURI作为参数,并可以结合Kohana强大的路由功能你创建的任意应用程序。

在控制器中使用Request Factory

下面的例子为你展示如何在其他控制器使内部使用Request Factory。
虽然不能全部突出HMVC的强大功能,它可以为你展示如何将分开的两个请求布局到一个层。

<?php
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;
    }
}

在一个视图中使用Request Factory

另一个使用Request Factory的有效方式是从一个视图中调用请求。在下面的例子里我们通过从视图中调用动态菜单和动态页脚代替控制器。

<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 ?>

以上使用的是3.0的调用方法。response已经单独封装出去,只能通过方法来调用,不能作为一个成员。 3.1版本后去除了request的单例方法,全部使用工厂方法来调用,request中还做了其他的修改。 这种设计让我想到部分系统里的widget设计,其次目得都很明确,把可重用的业务能够封装起来,保证重用性。尤其是在VIEW里调用的话就成下图: 还有部分系统中widget只是作为一个展示的部件,这个根据不同的系统设计其实都会存在利弊,就看如何来利用了。 不过kohana中的这种机制为widget的设计带来了很多便利;

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注