2013-05-08 40 views
2

我正在創建一個新程序。它是以我以前從未創造過任何方式創建的。該方案主要包括以下內容:設置我的程序代碼的最佳方法

  • 的Index.html - 接口,只是HTML代碼
  • ActionController.js - 由包括index.html的,它包含了jQuery的掛鉤界面元素,品牌Ajax調用並更新接口
  • ExampleAction.php - ActionController使用Ajax調用的許多「Action」文件之一。它根據文件做了很多事情,但文件的佈局是相同的。

我這種設置有存在的問題如下:

1.I無法完成我的數據庫類創建一個單身,因爲使用AJAX我不得不創建一個新的數據庫實例在每個ExampleAction文件中。這是正常的行爲還是應該可能的,這可能是我的代碼中的東西?如果它應該是可能的,並且它是我的代碼中的東西,我會稍後發佈它。

如果我不夠清楚,這是我試過的: - 我將index.html重命名爲index.php(ofcourse)。 - 包含我的數據庫單例在這個文件的頂部。 - 對ExampleAction.php進行ajax調用。 - ExampleAction.php無權訪問數據庫類,我必須再次包含它並創建一個新實例。

2.當我進行Ajax調用時,我通過POST發送參數。該ExampleAction的總體佈局如下:

$actionInstance = new ExampleAction(); 
class ExampleAction { 
public __construct() { 
    this.GetAction(); 
} 

private GetAction() { 
    $action = $_POST['action']; 
    switch ($action) { 
    case "Login": 
    this.Login(); 
    break; 
    } 

    //Login function, etc. here 

} 
} 

Ofcourse我真正的代碼包含消毒和這樣的switch語句更長,它包含了很多更多的功能

我不喜歡這個怎麼樣是兩件事。我不喜歡每次打電話給文件時都必須實例化對象,但我想這無法幫助。

第二件事是,如果我有很多功能,我的開關變得巨大。

所有這些問題都讓我覺得我對這一切都是錯誤的。

TL; DR: 我正在尋找建立一個程序,如一個我做的最好辦法。我感覺我讓我的代碼變慢(因爲ajax調用的數量越來越多),並且在一分鐘之內難以維護(因爲不斷增加的switch語句)

+0

**請勿使用單身**。他們是邪惡的。瞭解MVC,分離問題。你會在前方走很長的路,但這是值得的。 – Jimbo 2013-05-08 09:37:40

回答

2

您必須爲每個AJAX調用實例化一個新對象的原因是因爲AJAX調用是從客戶端向您的服務器的新請求。被調用的腳本沒有在你的程序中運行,並且必須在腳本被AJAX調用時完成任何設置。

解決此問題的最佳方法是使用利用MVC的框架,如codeigniterZend Framework。簡而言之,如果使用正確的話,使用MVC框架將不再需要爲每個AJAX調用實例化對象,因爲這是由控制器處理的,並且您將能夠失去switch語句,因爲每個AJAX調用都可以通過一個唯一的URI與一個處理所有這些不同呼叫的控制器。

編輯:在repsonse評論 不幸的是,我沒有與Zend框架的任何經驗,但我敢肯定,前提是幾乎一樣笨。因此,在Codeigniter中,您將擁有一個擴展主控制器的AJAX控制器,因此可以訪問數據庫以及在主控制器中設置的其他所有內容。

在AJAX控制器中,您將擁有不同的方法來處理所有不同的AJAX調用。

//CI_Controller is codeigniter's base Controller 
class AjaxController extends CI_Controller { 
    public function __construct() { 
     parent::__construct(); 
     $this->output->set_content_type('application/json'); 
     // Can make calls to anything a normal controller can do 
    } 

    public function doSomething() { 
     // You have access to the database because you are extending 
     // and calling the parent constructor 
     // $this->db->query(); 
    } 

    public function doSomethingElse() { 
     ... 
    } 

要調用這些AJAX功能,你的URI的將是http://mysite.com/Ajax/doSomethighttp://mysite.com/Ajax/doSomethingElse

正如我指出了前一個AJAX調用是從客戶端服務器一個全新的請求。當用戶請求一個頁面時,你的PHP代碼在服務器上運行,輸出發送到客戶端。任何JavaScript都在用戶瀏覽器中運行。如果您的JavaScript使AJAX調用這是一個新的請求到您的服務器,併發生在您的PHP從原始請求完成後。

+0

與Zend Framework合作之後,我很難將當前的設置轉換爲使用它。主要是因爲在我的思考過程中,我仍然會使用Ajax,最終我不得不再次實例化數據庫對象。我並不是說你不對,我只是說我不知道​​如何以解決我的問題的方式來解決你的建議。因爲這似乎是共識,我會將其中一個答案標記爲實際答案。我只想聽到關於此事的更多意見。 – Nick 2013-05-08 09:45:18

+0

看看我的編輯。希望它能清除一些事情 – RMcLeod 2013-05-08 09:59:42

+0

我明白了,這清理了很多!我不知道我會從哪裏出發,因爲上次我試圖閱讀Zend Framework的文檔時,我的頭部爆炸了(儘管如此,我還是很熟悉)。我只是無法從中學到任何東西,因爲它好像是步驟丟失,而且是不完整的。無論如何,謝謝你,也許我會看看CodeIgniter來完成這個! – Nick 2013-05-08 10:09:10

1

很難簡單地向您提供你的程序的「最佳方式」

但是,我建議你深入瞭解MVC模式並瞭解它的結構,然後嘗試在自己的代碼中實現類似的方法。

這裏是關於MVC一個基本的解釋,但不要花時間去谷歌和閱讀更多的則只是這一些文字:

通俗地說定義MVC

記住你技術上很注重和 接近的代碼。 MVC你是像白天一樣清晰,但是說的 企業的模型,視圖位指示「可以給他們的印象是 你是從某種形式的抽動穢語綜合症。即使在您將其定義爲 代碼之後,MVC也不會意味着 對於企業來說意義重大。爲了讓企業瞭解爲什麼是這樣的答案, 都至少它是什麼,可以多任務在我 經驗超過預期。即使有些開發人員偶爾也難以理解 。

爲了讓聽衆瞭解MVC是什麼以及爲什麼它能夠正常工作,我在傳遞過程中試圖將MVC應用於不同行業,其中 聽衆更多地參與其中。一個例子,在過去的 工作與財產或甚至 車比較。大多數人都已經處理與建設者,木匠, 管道工,電工或看過的財產洪水顯示了 電視。這種體驗是一個很好的平臺,可以用來解釋爲什麼像MVC這樣的分離工作。我知道你很可能認爲 是行不通的,因爲它是不一樣的軟件,但要記住你 不是要培養企業成爲開發商或有在MVC的 深入的理解,簡單地解釋給他們需要在生產中分離 ,這就是MVC結構所提供的。

爲了讓你如何形容這樣的一個例子,我有很簡單的解釋 分離,產權是如何工作的。請記住,這是 集中於使用未開發的系統,它可以解釋完全 不同的角度。

查看

MVC中的視圖是表示層。這是產品的最終用戶 將會看到並與之交互的內容。一個系統可以有多個從命令行輸出到 呈現的HTML的所有不同類型的多個 視圖。該視圖並不包含大多數清晰設計中的業務邏輯。該界面適合用途並且是 交互的區域。因此,您可以簡單地將消費者的HTML輸出到 與企業進行交互或輸出SOAP/XML。 都使用與系統相同的業務邏輯,也就是 型號和控制器。

在財產的世界中,您可以將財產的內部 視圖或居民 與之交互的財產的外層視爲視圖。內部可以根據用途進行定製,並且同一個房產可以有許多不同類型的租戶。例如,特定設計的財產可能包含住宅。 相同的內部空間可以很容易地用作辦公空間,其中 雖然在同一個屬性有不同的目的。然而 屬性結構是相同的。因此,用戶交互的環境不會影響建築物的結構。

控制器

所述控制器,其中魔法發生和定義業務 應用程序邏輯。這可能是用戶從視圖發送響應 的地方,然後使用此響應處理請求的內部工作,並將響應處理回給用戶。 在用戶請求購買書籍時採取典型的迴應。 控制器具有用戶ID,付款細節,送貨地址和 項目選擇。然後通過業務邏輯處理這些元素以完成購買。數據通過系統 傳遞到模型層,並且最終在整個請求滿足 業務定義,訂單被構造並且用戶 接收它們的物品之後。

如果我們比較這對一個屬性,我們可以在網上比較一 書的順序來打開電燈開關。一位租戶會彈開 開關,就像訂購一本書一樣。交換機本身是視圖層中的一個 元素,它將請求發送到控制器 ,就像點擊網站上的結賬按鈕一樣。在這種情況下,業務邏輯 是電工安裝並嵌入 屬性設計。輕擊開關,完成 電路。電力通過包括保險絲盒 的所有電線穿過燈泡。就像用戶收到一本 的書一樣,在這種情況下,租戶會收到燈光。 涉及電力佈線的幕後整個過程對於租戶 不可見。他們只是簡單地與空間內的交換機進行交互,並從控制器處理該請求的地方進行交互。

模型

MVC中的模型是最底層和處理核心邏輯系統的 。在大多數情況下,這可以被看作是 與數據源交互的層。在使用MVC的系統中,控制器 會將信息傳遞給模型以便存儲和檢索數據。從上述控制器定義示例開始,此 是訂單詳細信息的存儲位置。額外的數據,如股票 水平,書中產品的物理位置 都存儲在這裏。如果這是訂購的最後一本圖書,則該項目的下一個請求 可能會檢查它是否可用,並且由於該項目不再可用而不允許 訂單。

具有轉向燈開關上的出示例敷貼,這一級 我們的結構可能是電力供應。當房客筆觸 開關,內部電路必須請求電力以驅動 請求時,用戶請求從數據庫 數據,如在數據需要處理請求是相似的。如果住宅 未連接到電源,則無法完成此過程。 使用MVC帶來的商業利益

當您在解釋MVC是什麼時得到消息後,您將會看到 必須從中獲得哪些好處。我不打算去 成爲一個大量的細節在這裏,我相信你可以更準確地應用與您的實際情況直接相關的好處 。到 列表只是一些基於MVC的系統的一些共同的好處在這裏是 幾個例子:

不同的技能水平可以在不同的系統級別上工作。對於 示例設計人員可以使用很少的開發知識在接口(View)上工作,開發人員可以在業務邏輯 (控制器)上工作,而對設計級別的關注很少。然後他們在完成時簡單地整合在一起。由於上述 分離項目可以更容易和更快地管理。設計者 可以在開發者之前啓動接口,反之亦然。這個 開發過程可以是並行的,而不是順序的 ,因此縮短了開發時間。容易有多個視圖類型 使用相同的業務邏輯。清除系統中的路由。你清楚地知道系統的不同層級在哪裏。通過系統的清晰路徑,可以共享和改進邏輯。由於您清楚知道從 數據到用戶的允許路線,並且可以沿着 路線進行明確的安全檢查,因此這增加了 的安全優勢。每一層都是自己負責的。 (關於點1)這個 意味着你可以擁有一個乾淨的文件結構,它可以被維護在 之內,並且比一個緊密耦合的系統更容易和更快速地管理,其中 你可能有很多重複的邏輯。具有清晰的結構意味着 開發將更加透明,如果適當地應用 ,將導致開發時間,維護問題和發佈週期減少。

有關如何在PHP實現MVC具體的PHP例子可以在這裏找到:http://phpmaster.com/the-mvc-pattern-and-php-1/

此外:明白,一個會控制在某個時候您呈現一個「查看」,這種觀點可以是HTML ,XML,JSON或其他。所以控制器也會處理你的AJAX請求。

+0

感謝您花時間閱讀我的問題。但是我使用MVC,但並不認爲它是相關的,因爲即使使用這種設計模式,我也會因Ajax調用而出現同樣的問題。在我使用Ajax調用的文件中,我無法訪問任何先前實例化的對象,例如數據庫類。這意味着我必須在每次Ajax請求之後重新實例化我需要的對象,這對我來說似乎有些過火。 – Nick 2013-05-08 09:35:32

+0

如果你設置你的控制器結構,你會有。控制器可以繼承/擴展彼此,在流程中設置環境。以前實例化的對象可以在Session中序列化(如果需要,可能需要使用__sleep和__wakeup),但這有點超出了問題的範圍。 – 2013-05-08 09:37:21

相關問題