CakePHP 3 - 仅允许在实体上保存特定字段的最简单方法

时间:2016-07-21 00:21:13

标签: php cakephp cakephp-3.0

在Cake 2中,您可以保存模型并指定要将保存限制到的字段。

是否有一种内置方式可以在Cake 3中完成此操作?例如,如果将请求数据直接放入新实体然后保存,那么如何告诉该方法只保存我允许的字段?

简化示例

// User makes a request; their POST data goes directly into the entity
$customer = $this->Customers->newEntity($this->request->data);
$this->Customers->save($customer);

这里显而易见的危险是我可以通过请求在该客户实体上设置我喜欢的任何属性。实际上,我只想保存几个特定的​​字段。

2 个答案:

答案 0 :(得分:3)

这就是以$_accessible实体属性

的形式提供的质量分配保护
class Customer extends Entity
{
    // allow only `first_name` and `last_name` to be mass assigned
    protected $_accessible = [
        'first_name' => true,
        'last_name' => true
    ];
}

以及fieldList

accessibleFieldsTable::newEntity/newEntities/patchEntity/patchEntities()选项
// allow only `first_name` and `last_name` to be mass assigned,
// ignoring the entity accessible defaults
$customer = $this->Customers->newEntity($this->request->data(), [
    'fieldList' => [
        'first_name',
        'last_name'
    ]
]);

accessibleFields选项将仅更改指定字段的可访问性。此外,它实际上会修改实体,即与fieldList不同,编组器将仅用作白名单而不是实体默认值,accessibleFields将更改实体$_accessible属性的值!

答案 1 :(得分:1)

有两种方法可以保护您免受此问题的影响。第一种方法是使用实​​体中的Mass Assignment功能设置可以通过请求安全设置的默认列。

_accessible属性允许您提供属性映射以及是否可以批量分配它们。值true和false表示是否可以对字段进行质量分配:

  

http://book.cakephp.org/3.0/en/orm/entities.html#entities-mass-assignment

    namespace App\Model\Entity;

    use Cake\ORM\Entity;

    class Article extends Entity
    {
        protected $_accessible = [
       'title' => true,
        'body' => true,
         '*' => false,
    ];
   }

第二种方法是在创建或合并数据到实体时使用fieldList选项:

        // Contains ['user_id' => 100, 'title' => 'Hacked!'];
          $data = $this->request->data;

        // Only allow title to be changed
          $entity = $this->patchEntity($entity, $data, [
                  'fieldList' => ['title']
                 ]);
           $this->save($entity);

您还可以控制可以为关联指定的属性:

            // Only allow changing the title and tags
           // and the tag name is the only column that can be set
              $entity = $this->patchEntity($entity, $data, [
                       'fieldList' => ['title', 'tags'],
                       'associated' => ['Tags' => ['fieldList' => ['name']]]
                       ]);
              $this->save($entity);

如果您的用户可以访问许多不同的功能,并且您希望让您的用户根据他们的权限编辑不同的数据,则使用此功能非常方便。

newEntity(),newEntities()和patchEntities()方法也接受fieldList选项。

  

更多信息:http://book.cakephp.org/3.0/en/orm/saving-data.html