2015-09-25 54 views
2

我正面臨着如何在我的laravel項目中實現驗證的困境,讓我解釋一下情況。Laravel 5模型驗證和授權

  1. 我正在使用角JS前端用戶界面並使用restful resource controllers與laravel進行通信。
  2. 我用我的控制器的store()update()方法form request validation通過rules()方法來驗證數據,並使用authorize()方法,這種方式確保了,我的數據是正確的,只有用戶使用正確的權限級別可以添加/編輯決定授權數據。在這一點上,一切都運行良好,只要數據通過api發送的表單/ ajax請求到達。

現在,這是問題所在。有時插入/編輯操作需要以編程方式完成,例如,無論何時在表A中創建一行時,都需要在表B中創建一行,但在此之前,它還應該運行相同的驗證規則並檢查授權,以便在使用表單請求創建表B時執行此操作如果我只是打電話說TableA::Create([])該行將被創建沒有任何驗證。

當然,我可以使用Validator::make()模型內部以及後來, 一)它使模型凌亂b)是代碼的重複

所以,我的目標是確保無論多麼表A的記錄將進入數據庫,如果它是從應用程序完成的,那麼將在保存數據之前執行檢查,同時保持驗證和授權規則的核心。在我看來,要走的方式是在模型的「保存」事件上掛鉤,並以某種方式觸發formrequest驗證器?但我不確定。

我看到Jeffrey Way的automatic model validator,但那是Laravel 4.在Laravel 5.x中有沒有優雅的方式來做到這一點?另外,作爲一個附加問題,當我在其他地方提出這個問題時,有些人說他們「不是基於模型驗證的粉絲」,但沒有解釋爲什麼它不是一個好主意,所以我也想知道基於模型的驗證有什麼缺點?

回答

4

我建議退後一步。試圖抽象所有東西是一種誘惑,所以沒有一條邏輯可以重複,但是你需要明白爲什麼/你在這裏驗證什麼。

在開發應用程序的早期階段,你可能會認爲你是重複驗證邏輯到處的感覺,並可能擔心,如果你把驗證控制器中,你會錯過的東西 - 比如,「什麼如果我添加一個控制器方法並在更新模型之前未能驗證數據,會發生什麼?「。因此,接下來的自然步驟是將驗證推入模型。

但是!你應該回頭思考你正在驗證的內容。您在您的控制器中驗證的內容,並不總是與您在模型中驗證的相同。

有關MVC驗證的詳細信息,請參閱堆棧姊妹網站下面的鏈接: https://softwareengineering.stackexchange.com/questions/97880/in-mvc-should-a-model-handle-validation

在我看來,陷阱是,在發展的早期階段,控制器和模型驗證是SOOOOO相似你可能會認爲他們是一樣的。發生這種情況是因爲你自然從一些簡單的模型開始,讓球滾動。你剛剛驗證過(在控制器中)用戶的名字不是「_-_ kablamo!-_-」,那麼在模型中你正在做同樣的事情。

當您移過簡單的用戶模型時,您會發現模型和控制器更復雜,並且驗證依賴於可能不僅僅是當前請求數據 - 例如,它可能依賴於其他數據系統,一年的時間,季節,如果月亮對齊。

我聽到你尖叫那麼,這並沒有真正幫助第一段,你說:「如果我錯過了一些新的控制器方法驗證會發生什麼?」。我的答案很簡單,就是測試。你的單元測試應該立即選擇它。

1

這是一個嚴重的問題已經有太多的談話並沒有足夠的解決方案的。

Laravel假定您可以在前端,路由,控制器或模型上進行驗證,但代碼的體系結構假定大多數用戶將驗證距離用戶更近的路徑,在控制器 - 而不是在模型中。對於簡單的解決方案,這是可以的模型可以被不同職責的多個控制器使用時,這並不好。

模型需要作爲規則和驗證的單一權威點。
控制器和路由可以應用其他適合的驗證。

40年來,您擁有的功能越多,擁有的開發人員越多,您的數據可能會讓一個可能會起訴您的人的財務影響越大,您需要執行的驗證就越接近後端。您的應用程序越小,開發人員越少,您的信息越不重要,您的信息在前端附近的驗證就越多。

但是,一般來說,您可以在路線,模型,控制器和數據庫中驗證其用途。 (上面有人說過)

'測試會抓住它'是對這個問題的一種千禧年(在貶義)答案。無論您的業務規則是聲明性的還是可觀察的,或者它們不是聲明性的和「神奇的」。而傑瑞德有一段時間......與聲明和可觀察到的奇怪關係。

有很多軟件包可以很好地工作,但我不確定是否最新。

1. laravel-殷切/殷切

2.莫蒂默/辛酸

3。jaspaul/eloquent-model-validation

'最簡單'的答案是創建一個覆蓋save函數,執行驗證並捕獲任何錯誤並將它們添加到存儲桶的基類。

就我個人而言,我不知道爲什麼'熱心'不只是'它的方式'。不幸的是,作者似乎沒有繼續下去。