2011-09-21 52 views
3

一直困擾着我的東西是做多個循環來操作數組。MVC PHP:在視圖循環或控制器循環(即1個循環或2個循環)中的數據操作

我的意思是,在控制器中,數據是通過模型從數據庫中提取的。比方說我們顯示的用戶的列表,並且每個用戶都有一個狀態(1,2,3等同於驗證,驗證的分別,禁止)。在循環的狀態將通過另一個數據庫查詢進行檢查和顯示的每次迭代(忘了MySQL的在這個例子中加入)。

現在,你會在循環中的控制器中執行該操作,然後在視圖中執行另一個循環,所有數據已經​​被獲取並預先準備好顯示(因此導致2個循環)。

- 或 -

你只是做它,因此導致一個循環,但與模型從視圖調用視圖。我明白,在嚴格的MVC模式中這是可以的,但它通常會皺起眉頭。

循環兩次似乎很愚蠢,但隨後所有的數據操作都保存在控制器中,看起來很整潔。

+0

謝謝你的答案。我理解這裏的理想答案是使用數據庫來處理這種數據請求。也許我可以重新思考我在做什麼。此刻我只是試圖計劃將我的代碼移植到未來擴展的MVC模式中。爲了在談論用戶時說清楚,Im實際上只是在談論電子郵件地址列表。它在這種情況下與ACL無關。應該做得更清楚。 –

回答

2

我會那樣做,也不在視圖或控制器,但在模型上。

我解釋一下:

  • 你的控制器的任務是獲取預期的用戶列表中,選中ACL等...
  • 您的視圖的工作是在一個優雅的形式來呈現這些數據
  • 你模擬作業從數據庫獲取/存儲數據並確保完整性。 Userstatus對我來說也是一個模型。

我的配置使這非常簡單,我使用小鬍子(Php端口)進行查看,這使我可以直接從我的模型中調用方法。我爲我的模型寫了自己的ORM,這樣我就有了包裝。

這樣的代碼會看起來像我:

// Controller 
$template = new Template('pages/users.html'); 
$template->users = mUser::find(); // return array of mUsers instances 
echo $template->render(); 

// View 
{{#users}} <!-- For each user --> 
    {{getName}} has status {{#getStatus}}{{getStatusName}}{{/getStatus}}<br /> 
    <!-- getStatus is a method from mUser model, that return a mUserStatus instance --> 
{{/users}} 

/* More explain on the view syntax 
{{name}} = $user->getName() (return string) 
{{getStatus}} = $user->getStatus() (return instance of mUserStatus); 
{{statusName}} = $user->getStatus()->getStatusName(); 
*/ 

您可能希望在請求級別每個模型實例則請求高速緩存,讓你永遠不會運行要求的兩倍,如果沒有必要的。

這似乎更自然的我,而不是委託給控制器。我嘗試將商業智能放在控制器上,不需要智能或程序員干預來爲每個用戶檢索狀態名稱。

我希望它能幫助。

+0

-1 「我試圖把商業智能放在控制器上。但是你的代碼看起來正確。 –

+0

你能解釋一下你的觀點嗎? –

+0

模型是一個邏輯的地方。控制器它只是一個工具,將用戶的請求傳遞給Model,並將答案返回給用戶(通常由View提供)。 –

0

做兩環是乾淨的方法。這是我在大多數情況下會做的,但我認爲這沒有一個通用的答案。就像如果你有很多數據和性能會遇到問題,最好忘記MVC並只使用一個循環。

第三種方法是使用可從視圖中調用的幫助函數。現在我想到了......這可能是最好的方法。

+0

「助手」是在模型中遺漏的代碼。 –

+0

我在說[Zend View Helpers](http://framework.zend.com/manual/en/zend.view.helpers.html) – PiTheNumber

+0

'最好忘記關於MVC' - 大聲笑 –

1

在我看來,操縱你要返回的數據的邏輯應該位於控制器中。操縱數據表示的邏輯可以位於視圖中。 所以我會去第二個選項。

但是,正如您自己指出的那樣,這是實施的一種選擇。

另請注意,多次往返您的數據庫對性能不利。你的例子是一個典型的n + 1問題,這意味着你有第一個'頂部'選擇查詢,然後在你的第一個結果集中的每行有N個查詢。如果遇到這樣的問題,總是試圖在數據庫級別解決它們。

我想補充的另一個說明是,在你的例子中,你正在將狀態解釋存儲在數據庫中。如果你想用其他語言提供你的應用程序,這可能會成爲一個問題。但這超出了你的問題的範圍:)