2016-11-19 48 views
2

我想知道,如果我遵循CakePHP框架中的最佳開發實踐。這是CakePHP中的正確開發方法嗎?

如果你有一個例如發票表,你要顯示的發票的狀態,讓我們說你要發票的這樣狀態的綠色標籤:

<span class="green">Paid</span> 

我做的是以下。我在名爲statuslabel的模型上創建一個虛擬場,在該虛擬場中我調用一個顯示元素的Helper。

所以這將是型號 - > Helper->元素

這樣在我的應用程序的任何地方我可以調用statuslabel就像是從模型的一個字段,我會得到statuslabel。

我的大問題是,如果這是正確的方式來做到這一點,或者我這樣做都是錯誤的?

+1

我只是使用tinyint2和[「枚舉」](http://www.dereuromark.de/2010/06/24/static-enums-or-semihardcoded-attributes/)和一個簡單的查看幫助器來格式化它。我根本不會修改模型層。 – mark

回答

0

您應該避免違反代碼中的MVC原則,在這種情況下特別包含模型代碼中的表示邏輯。這同樣適用於CakePHP和其他MVC框架。

您仍然可以繼續並創建一個名爲status的虛擬字段,它可以根據其他實體字段計算您的發票的狀態。如果您已將狀態作爲正常實體字段存儲在數據庫中,則可以跳過虛擬字段。

查看圖層是您想要所有演示代碼的位置。您可以直接在視圖中執行此操作,也可以將邏輯移至助手。助手中的適當函數會將狀態字段作爲輸入,並根據狀態值將相應的類輸出到模板中。

在視圖層(CakePHP中的模板和幫助程序類)中保留表示代碼的好處是,稍後通過更新模板很容易將其替換。 CakePHP 3還爲您提供了通過插件創建themes的選項,這就是您如何輕鬆地即時更改應用程序的UI,但前提是您堅持遵循MVC的設計原則。

+0

那麼html是從一個助手調用的模板文件上,我所做的就是將數據從我的模型傳遞給我的助手,是否違反了MVC原則? –

+2

您無法將模型中的數據傳遞給幫助者。我認爲你表達得很糟糕 - 你的意思可能是控制器獲取數據,將數據傳遞給視圖,模板本身調用幫助器,然後將模型數據傳遞給它。這一切都很好。 – mark

+0

這裏的問題是,你似乎不僅傳遞數據,而且傳遞邏輯。如果您將狀態作爲字符串值傳遞,例如, ' 「付費」'。數據由控制器從模型中獲取,然後放入視圖中。在你的幫助類中,你應該有如下邏輯: – Petronius

0

通常使用虛擬字段並不是一個壞主意。有時,簡單回答背後的邏輯非常複雜,無法通過SQL或合理數量的SQL來完成。

重要的是要記住,大多數情況下,直接使用查詢無需額外的PHP處理就可以快得多。所以對於你的問題,如果你沒有任何PHP邏輯(除了生成SQL表達式),我會說,但它...

...還有一點關於數據庫設計的討論。

我不能說真正的問題背後的數據庫模式,但對我來說,發票狀態這樣簡單的事情應該肯定是在數據庫直接作爲和int類型字段。那麼說到我對發票系統的經驗,數據庫模式可能是這樣的:

發票

  • ID
  • invoice_status_id

invoice_statuses

  • ID
  • 標題

如果您創建模型關聯並正確查詢您的數據庫,您最終會在查詢結果中擁有發票狀態,您可以像描述的那樣使用它。

Btw。大多數情況下,使用可重用元素是很好的做法。更少的代碼來維護:D

相關問題