2016-09-17 62 views
1

假設我們有模型AB,並且我們需要根據從視圖發佈的信息來選擇其中哪一個實例化根據POST-ed模型類名選擇模型是否是一種好的做法?

難道是一個很好的做法,做這樣的事情:

// ... 
$this->validate($request, [ 
    'model.class_name' => 'in:A,B' // restrict users to only pass either 'A' or 'B' as class_name 
]) 

$data  = $request()->get('model'); // <-- contains: $data['id'] and $data['class_name'] 

$id   = $data['id']; 
$class_name = $data['class_name']; 

$$class_name::find($id); // <-- notice, that we are using POST-ed 'class_name' to determine which model we want to use! 
// ... 

還是這個辦法在今後引進的一些問題?

+0

這是非常糟糕使用任何類型的用戶輸入而無需驗證它。如果有人發送不應該訪問的類名,會發生什麼情況?您應該有一個控制器來檢查請求,驗證它並選擇合適的模型來使用。 –

+0

@MagnusEriksson是的,很自然。只是忘了將驗證包含在代碼段中。感謝您指出了這一點。除了驗證'class_name'外,是否還有其他問題? –

+0

我不會把類名放在我的視圖中,我會把它放在我的控制器中,讓視圖發送類似1,2,3等的東西......然後你可以在不同的控制器中使用相同的視圖來翻譯它們不同的是,如果您需要更換型號名稱,則只需更改控制器。而且你不把你的類名暴露給用戶......但這只是我的看法... –

回答

0

答案是

原因:

如果你的模型AB不同的功能?

在這種情況下,你需要添加額外的檢查其功能需要的,如果A,並給出什麼,如果B等。還,如果你認爲你有相同的功能集,你應該使用Repository Pattern調用,對於laravel參見this,這將幫助您使您的系統更具可擴展性,靈活性和可維護性。

它很好地知道什麼是完整的要求,並根據那個代碼。

希望這將幫助你:)

+0

謝謝,這是非常好的一點。用同樣的合同來綁定'A'和'B'怎麼樣?這樣,api問題就會解決。 –

+1

版本庫模式它實際上是基於契約的,所以你在想這個模式已經提出了。 –

相關問題