我必須爲移動設備顯示不同的視圖,並且我想提供一個簡單的JSON-API。 我寫了Kohana的框架,它加載取決於某些情況下不同的看法,這將有助於我在這種情況下,一個小模塊:https://github.com/ClaudioAlbertin/Kohana-View-Factory管理不同的輸出格式或設備類型
不過,我不是很滿意這個解決辦法,因爲我無法設置不同資產用於不同的設備類型。另外,當我輸出帶有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;
}
}
你覺得呢?
因爲我想要一個移動網站。這需要不同的視圖(HTML)和不同的資產(樣式表,腳本...)。我也想要一種簡單的方式來獲取數據爲JSON,它不需要HTML模板和特殊視圖,但不需要資產。從加載HTML模板但希望輸出JSON的「Controller_Template_HTML」繼承是沒有意義的。但是整個數據的獲取和設置都是一樣的,所以我認爲我將這兩項任務分開了。使用我的模塊,也無法爲移動視圖設置不同的資產。 –
它不再是傳統的MVC,它是一種很容易集成到現有MVC框架中的子模式(至少在Kohana中)。 –