我必须为移动设备显示不同的视图,我想提供一个简单的JSON-API。 我为Kohana框架编写了一个小模块,它根据某些情况加载不同的视图,在这种情况下可以帮助我:https://github.com/ClaudioAlbertin/Kohana-View-Factory
但是,我对此解决方案不太满意,因为我无法为不同的设备类型设置不同的资源。此外,当我使用JSON视图输出JSON时,它仍然包含在所有HTML模板中。 现在,我正在寻找更好的解决方案。 如何在MVC应用程序中处理不同的输出格式或设备类型?
我有一个想法:只需将控制器拆分为两个控制器:数据控制器和输出控制器。
一个小例子:
<?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;
}
}
您怎么看?
答案 0 :(得分:0)
嗯......从第一个视图来看,它很奇怪,而且有点像分形 - 我们在MVC上打破了我们的一个MVC - C.
但是为什么这个应用程序会根据入口点(或设备)返回如此不同的结果?
控制器的任务只是获取数据并选择视图 - 为什么我们需要独立逻辑来根据入口点(设备)选择某些东西?
我认为应首先回答这些问题。某处可能有些问题。
此外,cotroller应该理想地只选择一个视图,并且不要根据当前输出“执行”编码“或”数据。我认为所有这些应该是某种“布局”或者其他。由于数据总是相同的,甚至不同的视图应该是相同的 - 只有一些方面会发生变化。