TCA 类型 json 的字段的正确 php 类型是什么?

问题描述 投票:0回答:1

我想在数据库中存储一些选项,如下所示:

    'question_options' => [
        'exclude' => false,
        'label' => 'xxx',
        'description' => 'xxx',
        'config' => [
            'type' => 'json',
            'default' => ''
        ],
    ],

我的 Model.php 的正确类型是什么?

/**
 * questionOptions
 *
 * @var string ?? array ?? object ?? mixed ??
 */
protected $questionOptions;

数组显示 null,并且通过 setter 设置字符串时字符串会被转义。

php typo3 extbase
1个回答
0
投票

您可以利用 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
包中看到此功能的实际实现:

  1. 域/数据/JsonData.php
  2. 域/模型/FormLogEntry.php
© www.soinside.com 2019 - 2024. All rights reserved.