簡體   English   中英

控制器和視圖-Zend Framework中的MVC

[英]Controllers and Views - MVC in Zend Framework

我在基於PHP的Zend Framework中使用MVC。 這更多是一個設計問題。 我有一個控制器,它有幾個動作。 這些動作可通過AJAX從控制器的視圖訪問。 控制器的動作,通過訪問模型內​​部函數中的數據來執行業務邏輯,以及構造或回顯HTML。 將此HTML吐回以在AJAX響應中查看。 我對控制器的理解是,它們根本不應該包含任何HTML。 但是鑒於視圖中的AJAX,我覺得除了在控制器中動態生成HTML外,我別無選擇。 這是一個好的設計嗎? 我該如何改善?

確實有兩個動作幫手。 您可以通過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'設置了調用動作時,它將自動序列化內容,在這種情況下,將給出My_Model返回的項的json數組: fetchAll();

format參數可以在url“ / my / index / format / json”中傳遞,也可以在get查詢中輸入“ / my / index?format = json”

真正的魔力是上下文切換器還為響應類型(例如內容類型)設置適當的標頭。

您甚至可以指定自己的上下文以及要發送的標頭。 在此處閱讀有關上下文切換的更多信息

首先,業務邏輯應該在模型中,而不是在控制器中。

其次,我的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捕獲為字符串以通過控制器返回。 這將使您可以在視圖中保持演示。

始終嘗試在視圖中保留任何表示邏輯。 我認為適合您的應用程序的正確設計方法應該是:

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模式設計用於的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM