Управление различными форматами вывода или типами устройств - PullRequest
0 голосов
/ 11 июля 2011

Мне нужно отобразить различные представления для мобильных устройств, и я хочу предоставить простой JSON-API.Я написал небольшой модуль для Kohana Framework, который загружает различные представления в зависимости от некоторых обстоятельств, что должно помочь мне в этом случае: https://github.com/ClaudioAlbertin/Kohana-View-Factory

Однако я не очень доволен этим решением, потому что я могу 'установить разные активы для разных типов устройств.Кроме того, когда я выводил JSON с JSON-представлением, он все еще был заключен во все HTML-шаблоны.Теперь я ищу лучшее решение. Как вы обрабатываете различные форматы вывода или типы устройств в ваших MVC-приложениях?

У меня была идея: просто разделить контроллер на два контроллера: контроллер данных и выходнойконтроллер.

  • Контроллер данных получает и устанавливает данные с помощью моделей, выполняет всю проверку и т. д. Он получает данные из моделей и записывает их в объект данных, который затем передается.в представление.
  • Выходной контроллер загружает представления и передает им объект данных из контроллера данных.Для каждого формата или типа устройства существует выходной контроллер: выходной контроллер для мобильных устройств может загружать мобильные представления и добавлять все мобильные версии таблиц стилей и сценариев.JSON-output-controller может загрузить представление без всего материала 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;
    }

}

Что вы думаете

1 Ответ

0 голосов
/ 11 июля 2011

Хм ... С первого взгляда это выглядит странно, и как-то похоже на фрактал - мы ломаем на MVC один из наших MVC - C.

Но почему это приложение дает такие разные результаты,основанный на точке входа (или устройстве)?

Задача контроллера - только получить данные и выбрать представление - зачем нам нужна отдельная логика для выбора чего-либо на основе точкизапись (устройство)?

Я думаю, что на эти вопросы нужно ответить в первую очередь.Где-то может быть какая-то проблема.

Кроме того, контроллер должен выбирать в идеале только одно представление и не делать «кодирование» или что-либо еще с данными, основанными на текущем выводе.Я думаю, что все это должно быть в каких-то «раскладках» или в другом месте.Поскольку данные всегда одинаковы и даже разные представления должны быть одинаковыми - меняются только некоторые аспекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...