[英]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.