我想创建一个我希望在CakePHP中可更新的字段白名单。我知道我可以在调用Model :: save()时传递一个fieldList数组,但这不是我想要的。我想要的是每个模型“发布”一个有效字段的列表,所以如果我调用没有fieldList的Model :: save()方法和不能更新的数据(如ownerId),这将不会更新。
我该怎么做才能得到这种行为?也许覆盖每个模型中的Model :: save方法来调用“原始”模型::使用白名单保存?我认为这是一个好主意,因为我没有污染所有具有大量重复白名单的控制器...
感谢您的帮助!
答案 0 :(得分:2)
好的,谢谢大家的答案,但我错了:我不需要添加此功能。
我试图解决的问题是安全问题,我试图避免形式篡改(我刚才发现了这个名字),而且我是CakePHP用户的新手,我不知道 CakePHP已经解决了这个问题。
我的问题的答案非常简单:我必须使用CakePHP的安全插件并使用表格篡改预防(http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html#form-tampering-prevention)。
答案 1 :(得分:0)
不能说我曾经需要在CakePHP中执行此操作,但CakePHP只保存您传递的字段。
如果真的需要创建一个白名单,并且您某些,那么曾希望这些字段保存并从来没有你的数据库中的任何其他人(虽然我不明白为什么你有它们的列,如果你从来没有触摸它们)然后你可以在模型回调方法中模拟这种行为:
<?php
class User extends AppModel {
public function beforeSave($options = array()) {
$whitelist = array('first_name', 'last_name', 'email');
foreach ($this->data[$this->alias] as $field => $value) {
if (!in_array($field, $whitelist)) {
unset($this->data[$this->alias][$field]);
}
}
return true;
}
}
这将取消设置不在$whitelist
数组中的任何数据,但如果您确实不希望更新列,则不要为其传递值。