Php Codeigniter 4实体属性强制转换为数组而不是自动序列化
我试图将实体属性强制转换为数组,以便它自动序列化 实体的设置如下所示 \App\Entities\Submission.phpPhp 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
将此添加到您的实体中:
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);