2011-07-11 46 views
0

我必須爲移動設備顯示不同的視圖,並且我想提供一個簡單的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; 
    } 

} 

你覺得呢?

回答

0

嗯......從第一視圖,它loooks奇怪,不知何故像分 - 我們正在打破MVC一個我們MVC的 - C.

但是爲什麼這個應用程序將返回如此不同的結果,根據在入口點(或設備)上?

控制器的任務只是獲取數據並選擇視圖 - 爲什麼我們需要單獨的邏輯來選擇基於入口點(設備)的東西?

我認爲應該先回答這些問題。某處可能會有一些問題。

此外cotroller應該只選擇一個理想的視圖,而不是「編碼」或數據,根據當前輸出。我認爲這應該是某種「佈局」或其他。由於數據總是相同的,甚至不同的觀點應該是相同的 - 只有一些方面的變化。

+0

因爲我想要一個移動網站。這需要不同的視圖(HTML)和不同的資產(樣式表,腳本...)。我也想要一種簡單的方式來獲取數據爲JSON,它不需要HTML模板和特殊視圖,但不需要資產。從加載HTML模板但希望輸出JSON的「Controller_Template_HTML」繼承是沒有意義的。但是整個數據的獲取和設置都是一樣的,所以我認爲我將這兩項任務分開了。使用我的模塊,也無法爲移動視圖設置不同的資產。 –

+0

它不再是傳統的MVC,它是一種很容易集成到現有MVC框架中的子模式(至少在Kohana中)。 –

相關問題