我想在数据库中存储一些选项,如下所示:
'question_options' => [
'exclude' => false,
'label' => 'xxx',
'description' => 'xxx',
'config' => [
'type' => 'json',
'default' => ''
],
],
我的 Model.php 的正确类型是什么?
/**
* questionOptions
*
* @var string ?? array ?? object ?? mixed ??
*/
protected $questionOptions;
数组显示 null,并且通过 setter 设置字符串时字符串会被转义。
您可以利用 Extbase 的特殊
TypeInterface
它将获取由 DataMapper
作为构造函数参数传递的原始 数据。
这允许您使用实现
TypeInterface
作为域模型属性类型的类。在这种特殊情况下,您可以自动将原始 JSON 字符串转换为类似数组的结构,如下所示:
<?php
declare(strict_types=1);
namespace Acme\Package\Domain\Data;
use TYPO3\CMS\Core\Type\TypeInterface;
final class JsonData extends \ArrayObject implements TypeInterface
{
public function __construct(string $jsonString)
{
$data = json_decode(
json: $jsonString,
associative: true,
flags: \JSON_THROW_ON_ERROR,
);
parent::__construct($data);
}
public function __toString(): string
{
return json_encode(
value: $this,
flags: \JSON_THROW_ON_ERROR,
);
}
}
您的域模型现在可以使用它作为属性类型:
declare(strict_types=1);
namespace Acme\Package\Domain\Model;
use Acme\Package\Domain\Data\JsonData;
use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
final class Example extends AbstractEntity
{
public ?JsonData $data = null;
}
现在所有实例都允许您透明地访问已解码的 JSON 数据。假设此
$example1
模型的对象 Example
在其 {"foo":"bar"}
列中具有 tx_package_domain_model_example.data
作为数据:
$example1->data['foo'];
{example1.data.foo}
您可以在
pagemachine/typo3-formlog
包中看到此功能的实际实现: