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

Php 管理不同的输出格式或设备类型,php,model-view-controller,api,format,Php,Model View Controller,Api,Format,我必须为移动设备显示不同的视图,我想提供一个简单的JSON-API。 我为Kohana框架编写了一个小模块,该模块根据某些情况加载不同的视图,在这种情况下应该对我有所帮助: 但是,我对这个解决方案不是很满意,因为我不能为不同的设备类型设置不同的资产。另外,当我用JSON视图输出JSON时,它仍然包装在所有HTML模板中。 现在,我正在寻找更好的解决方案。如何在MVC应用程序中处理不同的输出格式或设备类型 我有一个想法:把控制器分成两个控制器:一个数据控制器和一个输出控制器 数据控制器在模型的帮助

我必须为移动设备显示不同的视图,我想提供一个简单的JSON-API。 我为Kohana框架编写了一个小模块,该模块根据某些情况加载不同的视图,在这种情况下应该对我有所帮助:

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

我有一个想法:把控制器分成两个控制器:一个数据控制器和一个输出控制器

数据控制器在模型的帮助下获取和设置数据,是吗 它从模型中获取数据并将其写入数据对象 这将稍后传递给视图。 输出控制器加载视图,并从数据控制器向它们提供数据对象。每个格式或设备类型都有一个输出控制器:移动设备的输出控制器可以加载移动视图并添加样式表和脚本的所有移动版本。JSON输出控制器可以加载不包含所有html模板内容的视图,并将数据转换为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;
    }

}

你觉得怎么样?

嗯。。。从第一个角度看,它看起来很奇怪,而且有点像分形-我们正在打破MVC的MVC-C之一

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

控制器的任务只是获取数据并选择视图-为什么我们需要独立的逻辑来选择基于进入点设备的东西

我认为这些问题应该首先得到回答。某个地方可能有问题


此外,COTROLER最好只选择一个视图,不要根据当前输出进行编码或使用数据。我认为所有这些都应该在某种布局或其他方面。由于数据总是相同的,甚至不同的视图应该是相同的-只有某些方面会发生变化。

因为我想要一个移动站点。这需要不同的视图、HTML和不同的资产、样式表、脚本……我还需要一种简单的方法,以JSON的形式获取数据,它不需要HTML模板和特殊的视图,但不需要资产。从Controller_Template_HTML继承是没有意义的,后者加载HTML模板,但希望输出JSON。但是整个数据的获取和设置都是一样的,所以我想我把这两个任务分开了。在我的模块中,也不可能为移动视图设置不同的资产。它不再是经典的MVC,而是一种易于集成到现有MVC框架中的子模式,至少在Kohana是这样。