带有JSON数据的CakePHP夹具

时间:2018-02-06 10:10:23

标签: json cakephp cakephp-3.0 fixtures

我正在使用最新的CakePHP版本,并希望使用fixtures进行一些PHPunit测试。我的MariaDB版本不支持JSON数据类型,因此我将TEXT数据类型用于应存储json数据的表列。例如,我有一个名为 Items 的表,其中包含 json_options 列。我已将CakePHP的预定义自定义JSON数据类型包含在我的表模型中:

// in src/Model/Table/ItemsTable.php

protected function _initializeSchema(TableSchema $schema)
{
    $schema->columnType('json_column', 'json');
    return $schema;
}

现在我正在使用Bake控制台生成Fixtures并从表中导入一些记录:

 bake fixture items -c fixture -r

(简化)结果是这样的:

// in /tests/Fixture/ItemsFixture.php

public $fields = [
    'id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
    'json_options' => ['type' => 'text', 'length' => null, 'null' => true, 'default' => null, 'collate' => 'utf8_general_ci', 'comment' => '', 'precision' => null],

public $records = [
    'id' => 1
    'options' => array(
        'someKey' => 'someValue'
    )    
]    

现在的问题是: json_options 列在$ fields-definition中的类型为 text ,但该记录包含数组而不是字符串。这在运行测试时会导致异常:

Exception: Cannot convert value to string in src\Database\Type\StringType.php

如果我将类型从文本更改为 json ,则测试正常。但是,在每次导入记录后,在所有表夹具中手动更改类型需要做很多工作。

那么Bake shell是否有可能在Fixture生成过程中检测到json列并使用正确的类型?或者有没有办法在Fixture中动态更改模式定义,例如在ItemsControllerTest.php的setUp()方法中?或任何其他提示如何处理Fixtures中的json数据?

1 个答案:

答案 0 :(得分:0)

只需覆盖灯具的构造函数:

/**
 * @inheritDoc
 */
public function __constructor() {
    parent::__construct();

    foreach ($this->records as &$record) {
        $record['data'] = json_encode($record['data']);
    }
}