2012-11-08 71 views
3

這是一個很好的做法來處理正常的Ajax調用一個控制器:好習慣? PHP MVC控制器阿賈克斯

<?php 

class SomeController extends Controller { 

    function index() { 

     if(!$this->input->is_ajax_request()) { 
      // load model 
      // create form 
      // pass data to view 
      // ... 
     } else { 
      // validate input 
      // load model 
      // write data to database 
      // return with some json string 
     } 

    } 

} 

有哪些優勢和劣勢?

+0

這就是我們在我們的項目是如何工作的。我建議你把所有東西放在檢查上面,只保留數據操作,比如傳遞數據來查看和返回json。這樣你就不會有雙重代碼。同樣的動作可以與ajax協同工作。 – Salketer

+0

「優點和缺點」完全取決於您的應用程序。 –

+0

@韋斯利教堂。請參閱下面的回覆。 – TheBlackBenzKid

回答

0

簡短回答:它取決於。

XHR(營銷人員稱之爲「AJAX」)和普通瀏覽器請求之間的真正區別在於XHR需要不同形式的響應。

在用於web的MVC啓發模式中,負責生成響應的部分是視圖實例。該觀點應該認識到,它必須產生哪種迴應,並採取相應的行動。這種情況下的控制器角色只能改變當前視圖的狀態。

或者,您可以在引導階段檢測到Accept HTTP標頭,並基於該標頭初始化不同的視圖實例。

以「全面貫徹視圖」我的意思是一個實例,其中包含了MVC的UI邏輯和可以決定的迴應。此響應可以是HTML文檔,由多個模板,JSON/XML文件或簡單的HTTP標頭組成。

  • 優點:關注適當分離,易於維護
  • 缺點:必須實行全員MVC

..但大多數的人做不使用完整的MVC實現。

如果你是一個人,而不是MVC靈感的模式,使用類似Rails的變體模式,那麼你將強制創建一個單獨的控制器來處理XHR。

在這種情況下,沒有真正的看法。它被啞模板取代,而UI邏輯已被合併到頁面控制器中。在這種情況下,唯一實用的選擇是創建一個單獨的控制器來處理XHR。

  • 優點:簡單的小項目實行
  • 缺點:可能的代碼重複,更難維護
+0

對不起,在完成所有這些編輯之後,我可能會贊成而不是:)然而「預計會有不同的迴應形式」。我們正在談論不同的事情 - XHR是基本的API,[AJAX](http://en.wikipedia.org/wiki/Ajax_(編程))是建立在它上面的**實踐**。我根本不需要不同的響應(AJAX可以很好地用於像普通請求一樣加載整個頁面)。 –

+0

「AJAX」很少與XML一起使用,不是排他性的,有時甚至不是異步的。對於「不同形式的響應」,我的意思是XHR希望HTML片段,XML文件,JSON文件,純文本或HTTP頭作爲響應,而不是完整的HTML文檔。這個改變只是在用戶界面上進行的,因此使其成爲視圖的範圍。如果控制器對其有影響,那麼它應該只是間接的。 –

+0

這是一個非常關注的話題,但是一個可愛的話題 - 「不是完整的HTML文檔」:這就是它不重要的東西,即使在使用完整的HTML文檔時也是如此 - 參見http:/ /jquerymobile.com/它完全基於AJAX的頁面導航。我同意一切,但:) –

0

我覺得這是開發者的選擇,考慮這個:

我覺得這是開發者的選擇,考慮一下。開發了我見過的客戶端移動網站。他們有一個網絡店和示範店:

/store/model/order.php 
/store/controller/order.php 
/store/view/order.php 

不是

/store/model/order_mobile.php 
/store/controller/order_mobile.php 
/store/view/order_mobile.php 

管理是一個噩夢。分離圖像,CSS,移動客戶端的多個編碼重複。對他們來說,解決方案現在是整個網站轉換成一個響應式設計

/new-dev-store-responsive/model/order.php 
/new-dev-store-responsive/controller/order.php 
/new-dev-store-responsive/view/order.php 

相同的代碼,但乾淨。而且我會在我的模板中使用AJAX調用,在一些代碼中使用PHP結構,而其他模式則不是。同樣可能難以管理。它會更好地處理使用JSON或外部靜態文件 - 所以PHP使用GET,POST等驅動。如果他們有JavaScript AJAX與PHP工作.. PHP代碼應該留在PHP IMO ..

/new-dev-store-responsive/model/order.php 
/new-dev-store-responsive/controller/order.php 
/new-dev-store-responsive/view/order.php 

//new-dev-store-responsive-cdn.com/assets/js/order.js 
//new-dev-store-responsive-cdn.com/assets/css/order.css 
//new-dev-store-responsive-cdn.com/assets/imgs/order/checkout.jpg 
+0

爲什麼選擇投票? – TheBlackBenzKid

2

即使這是一個AJAX請求,您仍然必須驗證輸入。這不是你發送你的應用程序的輸入(通過AJAX),它是瀏覽器,你不能相信

作爲一般設計原則,避免特殊情況(這裏:ajax與非ajax)。一般來說,你想平等對待所有案件,所以你最終得到一個orthogonal approach

正如你所看到的

class SomeController extends Controller { 

    function index() { 

     if(!$this->input->is_ajax_request()) { 

      // validate input <-- XXX here we need to validate it too 

      // load model 
      // create form 
      // pass data to view 
      // ... 
     } else { 
      // validate input 
      // load model 
      // write data to database 
      // return with some json string 
     } 

    } 

} 

這會導致重複的代碼(難以維護和保持同步)。

您的代碼,正交方法:

class SomeController extends Controller { 

    function index() { 
     // load model (takes care of his own validation, the self-containment principle of OOP) 
     // coordinate same business logic done by different models 
     // return models/data to the view, the framework will decide whether it uses the html or the json view file 
    } 

} 

相反,該模型(也可能是同一個模型類,或表單模型像有Zend框架,或在ZF2像there is保溼方法可以完成大部分工作(連同Table Gateway,DAO(如Doctrine 2)或類似的模型類),並且可以爲HTML和JSON創建兩個一致的視圖。 正確的看法是透明地爲你選擇,所以真的wo對於「是否這個AJAX?」,「沒有任何if/else」。

你應該試試一個現代的PHP框架(5.3 +),以感受如何接近design of your app in PHP

+1

這對我來說也是一個很好的答案,thx! – Danzzz

+0

@Danzzz很高興聽到這個消息,格拉茨的問候:) – Flavius

0

你的方法有幾個優點和缺點。

對於發佈公共數據沒有問題。

對於獲取公共數據我通常喜歡做在單獨的控制器,很多時候我甚至不把AJAX檢查,因爲我的數據是公開的,我希望它儘可能它可以去..

對於發佈/獲取私人數據我不喜歡使用這種雙面方法,因爲它更好地具有良好和乾淨(安全)的代碼...

如何..一切取決於您的選擇。一切皆有可能!並沒有常數是正確的,哪些不是。