[英]Yii2 allow post only data from model's scenario
我有ActiveRecord模型的User
使用以下場景()方法:
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios['create'] = ['username', 'email', 'password'];
return $scenarios;
}
另外,此模型具有rules()方法:
public function rules()
{
return [
['username', 'required', 'on' => ['create']],
['username', 'string', 'min' => 3, 'max' => 55],
['email', 'required', 'on' => ['create']],
['email', 'email', 'on' => ['create']],
['password', 'required', 'on' => ['create']],
['password', 'string', 'min' => 6, 'on' => ['create']],
];
}
我想拒絕使用“創建”方案中未包含的鍵發布所有數據(僅接收包含鍵的數據: 'username','email','password' )。
現在我在UserController
這樣做:
...
$activeAttributes = $model->activeAttributes();
$postParams = Yii::$app->getRequest()->getBodyParams();
foreach($postParams as $key=>$value){
if(!(in_array($key, $activeAttributes))) throw new \yii\web\HttpException(404, 'Invalid attribute:' . $key);
}
...
有沒有更優雅的方法可以做到這一點?
我不明白這樣做的好處是什么。
用戶可以發布任何數據,但是如果經過嚴格驗證,則無需擔心。
如果仍然要使用它,您的解決方案就可以了,不過這里有幾點建議:
為了獲取$_POST
數據,請使用高級方法\\Yii::$app->request->post()
(它可以返回所有數據,子數組或特定值)。 getBodyParams()
被調用。
404 Page Not Found
異常不適用於這種情況。 我認為400 Bad Request
更合適。
最好將內置的Yii2包裝器用於常見異常,例如BadRequestHttpException
。 這樣,您不必擔心其代碼,也不必擔心其含義。
activeAttributes()
返回不帶值的屬性名稱,因此您不必將foreach中的迭代元素分為$key
和$value
。
因此,這些更改之后的代碼可能是這樣的:
$model = new YourModel(['scenario' => YourModel::SCENARIO_CREATE]);
$activeAttributes = $model->activeAttributes();
foreach (\Yii::$app->requst->post() as $attribute => $value) {
if (!in_array($attribute, $activeAttributes)) {
throw new BadRequestHttpException("Invalid attribute: $attribute.");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.