2010-01-21 5 views
1

PHP 기반 Zend Framework에서 MVC를 사용하고 있습니다. 이것은 디자인에 관한 질문입니다. 나는 몇 가지 행동을하는 컨트롤러를 가지고있다. 이러한 액션은 컨트롤러의 관점에서 AJAX를 통해 액세스됩니다. 컨트롤러의 동작, 모델 내부의 함수에서 데이터에 액세스하여 비즈니스 논리를 수행하고 HTML을 생성하거나 에코합니다. 이 HTML은 AJAX 응답에서 다시 볼 수 있습니다. 컨트롤러에 대한 나의 이해는 HTML을 전혀 포함하지 않아야한다는 것입니다. 하지만 AJAX를 감안할 때 컨트롤러에서 HTML을 생성하는 것 외에는 선택의 여지가 없다고 생각합니다. 이것은 좋은 디자인입니까? 어떻게 개선 할 수 있습니까?Contollers 및 Views - Zend Framework의 MVC

+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의 컨텍스트를 추가하며, 작업이 요청 매개 변수 '형식'세트를 호출 할 때, 자동으로됩니다

은이 같은 컨텍스트 스위치를 초기화 이 경우에는 My_Model :: fetchAll()에서 반환 한 항목의 json 배열을 제공하여 내용을 serialize합니다.

형식 매개 변수 중 하나를 진짜 마법 맥락이다 URL에 "/ 내/색인/형식/JSON"또는 GET 쿼리 "/ 내/색인? 형식 = JSON"

에 전달 될 수있다 switch는 응답 유형 (예 : content-type)에 적절한 헤더를 설정합니다.

고유 한 컨텍스트 및 보낼 헤더를 지정할 수도 있습니다. 컨텍스트 스위치에 대한 자세한 내용 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

우선 비즈니스 로직은 컨트롤러가 아닌 모델에 있어야합니다. - 당신이 컨트롤러를 통해 반환하는 문자열로 렌더링 PHTML을 캡처 $this->view->render('controller/action.phtml');을 사용할 수 있습니다 잊지 마세요 또한

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; 
    } 

:

둘째, 내 아약스 요청은 일반적으로 형식의이 종류가 있습니다. 이렇게하면보기에서 프레젠테이션을 계속할 수 있습니다.

관련 문제