2011-07-11 2 views
0

モバイルデバイス用に異なるビューを表示する必要があり、単純なJSON-APIを提供したいと思います。 私はこの状況で私を助けるいくつかの状況に応じて異なるビューをロードするKohana Frameworkのための少しのモジュールを書いた:https://github.com/ClaudioAlbertin/Kohana-View-Factory異なる出力フォーマットまたはデバイスタイプの管理

しかし、私は非常に満足していないさまざまなデバイスタイプのアセットです。また、JSONビューでJSONを出力しても、それはまだすべてのHTMLテンプレートにラップされています。 今、もっと良い解決策を探しています。 MVCアプリケーションでさまざまな出力フォーマットやデバイスタイプをどのように扱いますか?

私は考えました。コントローラーを2つのコントローラー(データコントローラーと出力コントローラー)に分けるだけでした。

  • データコントローラが取得し、設定データをモデルの助けを借りて、それはモデルからデータを取得し、以降のビューに渡されるデータオブジェクト に書き込む すべての検証等を行います。
  • 出力コントローラはビ​​ューをロードし、データコントローラにデータオブジェクトを与えます。各フォーマットまたはデバイスタイプの出力コントローラがあります。モバイルデバイス用の出力コントローラは、モバイルビューを読み込んで、すべてのモバイルバージョンのスタイルシートとスクリプトを追加することができます。 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 1に壊している - C.

しかし、このアプリはベースなので、異なる結果が返される理由エントリポイント(またはデバイス)に?

コントローラのタスクは、データを取得してビューを選択することだけです。ポイントオブエントリ(デバイス)に基づいて何かを選択するためのスタンドアロンロジックが必要なのはなぜですか?

私はこれらの質問にまず答えるべきだと思います。どこかに問題があるかもしれません。

また、コントローラは1つのビューのみを理想的に選択し、現在の出力に基づいてデータをエンコードしないでください。私はこれが何らかの「レイアウト」にあるべきだと思います。データとしては常に同じで、異なるビューも同じでなければならず、一部のアスペクトだけが変更されます。

+0

モバイルサイトがほしいからです。これは異なるビュー(HTML)と異なるアセット(スタイルシート、スクリプト...)が必要です。また、HTMLテンプレートと特別なビューを必要とせずに資産を必要としないJSONとしてデータを取得する簡単な方法が必要です。 HTMLテンプレートをロードするがJSONを出力したい "Controller_Template_HTML"を継承するのは意味がありません。しかし、データの取得と設定はすべて同じですから、私はこれらの2つのタスクを分割すると考えました。私のモジュールでは、モバイルビューに別のアセットを設定することもできません。 –

+0

これはもう古典的なMVCではなく、既存のMVCフレームワーク(少なくともKohanaで)に簡単に統合できるサブパターンのようなものです。 –

関連する問題