管理不同的输出格式或设备类型

时间:2011-07-11 12:20:02

标签: php model-view-controller api format

我必须为移动设备显示不同的视图,我想提供一个简单的JSON-API。 我为Kohana框架编写了一个小模块,它根据某些情况加载不同的视图,在这种情况下可以帮助我:https://github.com/ClaudioAlbertin/Kohana-View-Factory

但是,我对此解决方案不太满意,因为我无法为不同的设备类型设置不同的资源。此外,当我使用JSON视图输出JSON时,它仍然包含在所有HTML模板中。 现在,我正在寻找更好的解决方案。 如何在MVC应用程序中处理不同的输出格式或设备类型?

我有一个想法:只需将控制器拆分为两个控制器:数据控制器和输出控制器。

  • 数据控制器借助模型获取和设置数据 所有验证等。它从模型中获取数据并将其写入数据对象 后来传递给了视图。
  • 输出控制器加载视图并从数据控制器为它们提供数据对象。每种格式或设备类型都有一个输出控制器:移动设备的输出控制器可以加载移动视图并添加样式表和脚本的所有移动版本。 JSON-output-controller可以在没有所有html-template内容的情况下加载视图,并将数据转换为JSON。

一个小例子:

<?php

class Controller_Data_User extends Controller_Data // Controller_Data defines a data-object $this->data
{

    public function action_index()
    {
        $this->request->redirect('user/list');
    }

    public function action_list()
    {
        $this->data->users = ORM::factory('user')->find_all();
    }

    public function action_show($id)
    {
        $user = new Model_User((int) $id);

        if (!$user->loaded()) {
            throw new HTTP_Exception_404('User not found.');
        }

        $this->data->user = $user;
    }

}

class Controller_Output_Desktop extends Controller_Output_HTML // Controller_Output_HTML loads a HTML-template
{

    public function action_list($data)
    {
        $view = new View('user/list.desktop');
        $view->set($data->as_array());

        $this->template->body = $view;
    }

    public function action_show($data)
    {
        $view = new View('user/show.desktop');
        $view->set($data->as_array());

        $this->template->body = $view;
    }

}

class Controller_Output_JSON extends Controller_Output // Controller_Output doesn't load a template
{

    public function action_list($data)
    {
        $view = new View('user/list.json');
        $view->users = json_encode($data->users->as_array());

        $this->template = $view;
    }

    public function action_show($data)
    {
        $view = new View('user/show.json');
        $view->user = json_encode($data->user);

        $this->template = $view;
    }

}

您怎么看?

1 个答案:

答案 0 :(得分:0)

嗯......从第一个视图来看,它很奇怪,而且有点像分形 - 我们在MVC上打破了我们的一个MVC - C.

但是为什么这个应用程序会根据入口点(或设备)返回如此不同的结果?

控制器的任务只是获取数据并选择视图 - 为什么我们需要独立逻辑来根据入口点(设备)选择某些东西?

我认为应首先回答这些问题。某处可能有些问题。

此外,cotroller应该理想地只选择一个视图,并且不要根据当前输出“执行”编码“或”数据。我认为所有这些应该是某种“布局”或者其他。由于数据总是相同的,甚至不同的视图应该是相同的 - 只有一些方面会发生变化。