получить данные объекта в структуре mvc - PullRequest
0 голосов
/ 14 декабря 2011

Я работаю с PHP MVC Framework. Работает действительно хорошо. Мне нравится разделение бизнес-уровня (модели) с бизнес-логикой (контроллером). Но я наткнулся на проблему. Вот в чем дело:

Предположим, я перехожу к следующему URL: http://localhost/user/showall/

В этом случае вызывается userController.php, и в этом файле есть метод showallAction (), который выполняется.

В методе showallAction () я просто делаю запрос к модели, которая получает всех пользователей за меня. Примерно так:

public function showallAction()
{
    // create userModel object
    $users = new userModel();

    // get all users and assign the data to a variable which can be accessed in the view
    $this->view->users = $users->getAllUsers();

    // render views
    $this->view->render();
}

Таким образом, этот метод получает всех пользователей, назначает данные, возвращенные из userModel, переменной, и я могу легко работать с возвращенными данными в моем представлении. Просто типичная вещь MVC.

Теперь возникает проблема. Мне также нужно создать родной вариант iphone. Конечно, внешность будет совершенно другой. Так что все, что я на самом деле хочу сделать, это запросить этот URL:

http://localhost/user/showall/

И это просто возвращает мне массив (в формате json). Так что я могу использовать это для мобильной разработки.

Но этого, очевидно, нельзя сделать прямо сейчас, потому что метод showallAction () предполагает, что он предназначен для отображения в веб-браузере. Он не соответствует формату JSON, вместо этого он просто присваивает массив пользователей переменной.

Так что это означает, что мне нужно создать другой метод "showallMobileAction ()" для получения данных, но специально для мобильного устройства. Но это не элегантное решение. Я уверен, что есть лучшие способы ...

Кто-нибудь есть идеи, как я могу решить эту проблему?

Ответы [ 3 ]

1 голос
/ 14 декабря 2011

В вашей ситуации я бы изменил механизм маршрутизации.

Было бы полезно, если бы вы могли добавить расширение в конце URL, которое представляет ожидаемый вами формат, например:

http://foo.bar/news/latest       >> HTML document
http://foo.bar/news/latest.html  >> HTML document
http://foo.bar/news/latest.rss   >> you RSS feed
http://foo.bar/news/latest.json  >> data in JSON format 

Это простой шаблон для распознавания. И позже вы можете расширить это, добавив .. не знаю .. PDF-файл или каналы Atom.

Дополнительно два комментария:

  1. Модель не является типом объектов. Вместо этого это слой, содержащий объекты, отвечающие за бизнес-логику, и объекты, отвечающие за хранение / извлечение данных.

  2. Представление должно быть полноценным объектом, к которому вы привязываете объекты домена (объекты, отвечающие за бизнес-логику).

0 голосов
/ 14 декабря 2011

Я не знаком с PHP MVC, но в общих чертах я бы использовал поле заголовка HTML «принимает» для запроса ответа либо в «text / html», либо в «text / json», контроллер проверял бы наличие принимает тип и возвращает ответ соответственно.

0 голосов
/ 14 декабря 2011

Вы можете передать параметры на ваш URL:

/user/showall/json

и получите третий сегмент URL с пользовательской или встроенной функцией. Например, с CodeIgniter: $this->uri->segment(3). Некоторые фреймворки передадут дополнительные параметры вашему методу. Просто попробуйте это с URL, который я написал выше:

public function showallAction()
{
  print_r(func_get_args());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...