Контроллеры и представления - MVC в Zend Framework - PullRequest
1 голос
/ 21 января 2010

Я использую MVC в Zend Framework на основе PHP. Это больше вопрос дизайна. У меня есть контроллер, который имеет несколько действий. Эти действия доступны через AJAX с точки зрения контроллера. Действия контроллера, выполнение бизнес-логики путем доступа к данным из функций внутри модели, а также создание или отображение HTML. Этот HTML-код отображается в ответе AJAX. Я понимаю, что контроллеры вообще не должны содержать HTML. Но учитывая AJAX в представлениях, я чувствую, что у меня нет выбора, кроме как генерировать HTML на лету в контроллере. Это хороший дизайн? Как я могу улучшить это?

Ответы [ 3 ]

4 голосов
/ 22 января 2010

Для этого есть два помощника. вы можете повторно использовать ваши действия для нескольких контекстов с помощью помощников действий ajaxContext или contextSwitch. Переключение контекста, как правило, более полезно в моем опыте, и оно может даже автоматически сериализовать данные, которые вы назначаете представлению в своем действии для ответов json, поэтому сценарий представления не требуется.

вы инициализируете переключение контекста следующим образом:

class MyController extends Zend_Controller_Action
{
    public function init()
    {
        $contextSwitch = $this->_helper->getHelper('contextSwitch');
        $contextSwitch->addActionContext('index', 'json')
                      ->initContext();
    }
    public function indexAction()
    {
        $this->view->items = My_Model::fetchAll();
    }
}

Вышеприведенное добавит контекст json к переключателю контекста, и когда действие вызывается с установленным параметром запроса 'format', оно автоматически сериализует содержимое, в этом случае давая массив json элементов, возвращаемых My_Model :: fetchAll ();

Параметр формата может быть передан либо по URL-адресу "/ my / index / format / json", либо с помощью запроса get "/ my / index? Format = json"

Настоящая магия заключается в том, что переключатель контекста также устанавливает соответствующие заголовки для типа ответа, такого как тип содержимого.

Вы даже можете указать свои собственные контексты и заголовки для отправки. Подробнее о переключении контекста здесь

2 голосов
/ 21 января 2010

Прежде всего, бизнес-логика должна быть в модели, а не в контроллере.

Во-вторых, мои ajax-запросы обычно имеют такой формат:

if ($ajax = $this->getRequest()->isXMLHttpRequest()) {
  $this->_helper->layout->disableLayout();   
};

// then later - if its responding with json:

  if ($ajax)
  {
    $this->_helper->viewRenderer->setNoRender(true);     
    $this->getResponse()->setHeader('Content-Type', 'text/json'); 
    echo $this->view->json($some_return_values);
    return;
  }

Также - не забывайте, что вы можете использовать $this->view->render('controller/action.phtml'); для захвата рендеринга phtml в строку для возврата через контроллер. Это позволит вам сохранить представление в представлении.

1 голос
/ 21 января 2010

Всегда старайтесь оставлять любую презентационную логику внутри представления. Я думаю, что правильный подход к дизайну для вашего приложения будет выглядеть примерно так:

AjaxController.php:

public function AjaxAction() {
    //do some logic
    //set content to a variable
}

ajax.phtml:

<p><?php //display the content of the variable setted in the controller ?></p>

Позже вы можете редактировать представление или действие отдельно, возможно, даже повторно использовать представление для некоторого подобного контента, сгенерированного ajax, и т. Д. Всегда старайтесь разделять вещи таким образом, именно так шаблон MVC предназначен для работы.

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