簡體   English   中英

Yii2允許僅發布模型場景中的數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM