2010-01-21 3 views
1

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

+0

Почему бы просто не вернуть представление в качестве ответа на запрос AJAX? Это должно быть возможно. –

ответ

4

Для этого нужно два помощника действий. вы можете повторно использовать свои действия для нескольких контекстов с помощью помощников действий 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 для переключения контекста, и, когда действие вызываются с набором параметров запроса «формат», он будет автоматически сериализуйте содержимое, в этом случае предоставляя json-массив элементов, возвращаемых My_Model :: fetchAll();

Параметр формат может быть либо принят в URL «/ мой/индекс/формат/JSon» или с ПОЛУЧИТЬ запрос «/ мой/индекс? = Формат JSON»

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

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

1

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

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 предназначен для работы.

2

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

Во-вторых, мои 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 в строку, чтобы вернуться через контроллер. Это позволит вам сохранить представление в представлении.

Смежные вопросы