2015-05-21 56 views
1

我在Yii2控制器延伸ActiveController是RESTful的,我可以使用PUT方法更新它確定。不過,我想設置一些屬性爲不安全的,因爲我不希望它們可以更新。如何在RESTful Yii2中將屬性設置爲不安全?

閱讀中,我想我可以做這樣的事情在模型中的一些規則不同的例子:

[['first_name','last_name','!password'], 'safe', 'on' => 'update'], 

但是這並不妨礙密碼被更新。

於是我找到了場景()方法,並認爲這應該工作:

public function scenarios() 
{ 
    return [ 
     'default' => ['*'], // Also tried without this line 
     'update' => ['first_name','last_name','!password'], 
    ]; 
} 

但阻止所有屬性得到更新。

沒有人有任何其他建議?

回答

2

此規則將只意味着屬性可以massivly分配(使用Model::load()),但是,如果沒有任何驗證以及在每個場景。

[['first_name','last_name','password'], 'safe'], 

但是你也可以在這裏使用,例如, '串'而不是'安全'。然後它也用於每個場景,但現在用字符串驗證。

用下面的介紹你一個「更新」的情況,你告訴FIRST_NAME確認引擎和姓氏應該是大規模轉讓並得到驗證,但密碼是從排除在外。就像你所期望的那樣。

public function scenarios() 
{ 
    return [ 
     'update' => ['first_name','last_name','!password'], 
    ]; 
} 

重要的是還您設置的更新或創建方案(控制器)調用load()或保存()之前:

$model = ... 
$model->scenario = 'update'; 
$model->load(...); 
$model->save(); 
+0

感謝您的答覆。由於控制器將ActiveController擴展爲RESTful,因此我沒有actionUpdate()方法,因爲RESTful Yii在後臺處理此操作。我希望不必爲了控制可以分配哪些值而重寫更新方法。 – Dubby

+0

@Dubby在你的例子中,你已經使用了基於場景的驗證規則。您必須定義在加載和保存之前必須明確使用哪個場景。你可以做什麼:設置[ActiveController :: $ updateScenario(http://www.yiiframework.com/doc-2.0/yii-rest-activecontroller.html#$updateScenario-detail),或者你可能會覆蓋[UpdateAction](HTTP ://www.yiiframework.com/doc-2.0/yii-rest-updateaction.html)。但覆蓋所述控制器,以改變作用是很平常([DOC])(http://www.yiiframework.com/doc-2.0/guide-rest-controllers.html#customizing-actions)。 – robsch

相關問題