Php Codeigniter 4实体属性强制转换为数组而不是自动序列化

Php Codeigniter 4实体属性强制转换为数组而不是自动序列化,php,codeigniter,codeigniter-4,Php,Codeigniter,Codeigniter 4,我试图将实体属性强制转换为数组,以便它自动序列化 实体的设置如下所示 \App\Entities\Submission.php 将此添加到您的实体中: public function __construct($arr) { $this->field2 = $arr['field2']; } 控制器: $allowedFromPost = [ 'field1'=>'value1', 'field2'=>[0,1], ]; $submission = new \App\E

我试图将实体属性强制转换为数组,以便它自动序列化

实体的设置如下所示

\App\Entities\Submission.php


将此添加到您的实体中:

public function __construct($arr) {
   $this->field2 = $arr['field2'];
}
控制器:

$allowedFromPost = [
'field1'=>'value1',
'field2'=>[0,1],
];

$submission = new \App\Entities\Submission($allowedFromPost);
var_dump($submission)
结果:

["attributes":protected]=>
  array(2) {
    ["field1"]=>
    string(6) "value1"
    ["field2"]=>
    string(22) "a:2:{i:0;i:0;i:1;i:1;}"
  }
根据CI文档,您需要在初始化其模型后进行设置:

<?php namespace App\Entities;

use CodeIgniter\Entity;

class User extends Entity
{
    protected $casts => [
        'options' => 'array',
                'options_object' => 'json',
                'options_array' => 'json-array'
    ];
}

$user    = $userModel->find(15);
$options = $user->options;

$options['foo'] = 'bar';

$user->options = $options;
$userModel->save($user);

问题仍然存在,字段2在设置时应自动序列化(根据CI文档),但它不是。您的解决方案和我的解决方案基本上都设置了两次属性,您在构造函数中进行设置,我在创建实体后进行设置。您是否尝试使用模型并保存数据?在DB中保存时可能会起作用。是的,如果不进行修复(只需创建提交并执行$submissionsModel->save($submission)),就会导致我在文章中描述的错误。同样,在没有修复的情况下,如果我将$field2设置为字符串而不是数组,则提交将保存在DB中。要将数组插入数据库,我必须执行上面描述的修复(设置$this->field2=$this->field2),我想只有在“呈现”时才会序列化该值
var_dump()
显示未序列化的php对象的内部内容。当您读取此属性,并且在执行下一次赋值时,您决定用其呈现值(此序列化数组的字符串)覆盖属性(数组)的当前内容时,会发生序列化。通常情况下,是这样的。特别是当强制转换为“array”、“json”或“json_array”时,序列化(或编码)发生在集合上,然后当您读取变量时,它将其反序列化(或分别解码)。检查我的编辑,这应该在将来修复。
$allowedFromPost = [
'field1'=>'value1',
'field2'=>[0,1],
];

$submission = new \App\Entities\Submission($allowedFromPost);
var_dump($submission)
["attributes":protected]=>
  array(2) {
    ["field1"]=>
    string(6) "value1"
    ["field2"]=>
    string(22) "a:2:{i:0;i:0;i:1;i:1;}"
  }
<?php namespace App\Entities;

use CodeIgniter\Entity;

class User extends Entity
{
    protected $casts => [
        'options' => 'array',
                'options_object' => 'json',
                'options_array' => 'json-array'
    ];
}

$user    = $userModel->find(15);
$options = $user->options;

$options['foo'] = 'bar';

$user->options = $options;
$userModel->save($user);