假設我們有模型A
和B
,並且我們需要根據從視圖發佈的信息來選擇其中哪一個實例化。根據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!
// ...
還是這個辦法在今後引進的一些問題?
這是非常糟糕使用任何類型的用戶輸入而無需驗證它。如果有人發送不應該訪問的類名,會發生什麼情況?您應該有一個控制器來檢查請求,驗證它並選擇合適的模型來使用。 –
@MagnusEriksson是的,很自然。只是忘了將驗證包含在代碼段中。感謝您指出了這一點。除了驗證'class_name'外,是否還有其他問題? –
我不會把類名放在我的視圖中,我會把它放在我的控制器中,讓視圖發送類似1,2,3等的東西......然後你可以在不同的控制器中使用相同的視圖來翻譯它們不同的是,如果您需要更換型號名稱,則只需更改控制器。而且你不把你的類名暴露給用戶......但這只是我的看法... –