有一种方法可以将生成的类配置为使用 camelCase 键。在您的 propel.json(或 .yaml、.php .ini .xml)配置文件中添加 objectModel,如下所示:
"generator": {
"defaultConnection": "bookstore",
"connections": [ "bookstore" ],
"objectModel": {
"defaultKeyType": "camelName"
}
}
这将使你所有的键都变成驼峰式,但事实证明这只适用于toArray() 方法。当您调用toJSON() 时,您实际上是在使用exportTo('JSON') 方法。如果您查看exportTo 方法,您可以看到它正在调用:
$this->toArray(TableMap::TYPE_PHPNAME, $includeLazyLoadColumns, array(), true)
这会强制 exportTo('JSON') 和 toJSON() 使用 TableMap::TYPE_PHPNAME 作为密钥类型。如果您查看toArray 方法定义,它使用您的"defaultKeyType" 作为默认$keyType。如果您在没有任何参数的情况下调用 toArray() 并且您有 "defaultKeyType": "camelName" 那么它将使用 TableMap::TYPE_CAMELNAME 并因此返回所有键作为驼峰式。
问题的根源在于 Propel 的生成器类。基类在
propel/src/Propel/Generator/Builder/Om/ObjectBuilder.php
如果我们看看它是如何生成toArray 方法的,我们会发现:
public function toArray(\$keyType = TableMap::$defaultKeyType, \$includeLazyLoadColumns = true, \$alreadyDumpedObjects = array()" . ($hasFks ? ", \$includeForeignObjects = false" : '') . ")
这里的重点是它使用了TableMap::$defaultKeyType。现在,如果我们查看exportTo 方法生成,我们必须查看templates/baseObjectMethods.php,exportTo 方法定义如下:
public function exportTo($parser, $includeLazyLoadColumns = true)
{
if (!$parser instanceof AbstractParser) {
$parser = AbstractParser::getParser($parser);
}
return $parser->fromArray($this->toArray(TableMap::TYPE_PHPNAME, $includeLazyLoadColumns, array(), true));
}
这里的重点是它使用硬编码值TableMap::TYPE_PHPNAME。如果您将该硬编码值更改为 TableMap::TYPE_CAMELNAME 并重新生成您的类,那么 toJSON() 会将所有键作为驼峰式命名。
所以很遗憾,如果不修改源代码,您将无法让 toJSON 使用 camelCase。我认为exportTo 方法应该使用defaultKeyType,所以我们可以使用配置来修改这种行为。话虽这么说,使用硬编码值而不是可配置值可能有充分的理由。
更新:
看起来这只适用于每个生成的模型类的单个实例。对于ObjectCollection 和Collection 类,toArray 和exportTo 方法使用TableMap::TYPE_PHPNAME 的硬编码值
Propel/Runtime/Collection/Collection.php
public function exportTo($parser, $usePrefix = true, $includeLazyLoadColumns = true)
{
if (!$parser instanceof AbstractParser) {
$parser = AbstractParser::getParser($parser);
}
$array = $this->toArray(null, $usePrefix, TableMap::TYPE_PHPNAME, $includeLazyLoadColumns);
return $parser->listFromArray($array, lcfirst($this->getPluralModelName()));
}
Propel/Runtime/Collection/ObjectCollection.php
public function toArray($keyColumn = null, $usePrefix = false, $keyType = TableMap::TYPE_CAMELNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = [])
{
$ret = [];
$keyGetterMethod = 'get' . $keyColumn;
/** @var $obj ActiveRecordInterface */
foreach ($this->data as $key => $obj) {
$key = null === $keyColumn ? $key : $obj->$keyGetterMethod();
$key = $usePrefix ? ($this->getModel() . '_' . $key) : $key;
$ret[$key] = $obj->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true);
}
return $ret;
}
如果我们可以使用配置文件将这些设置为TableMap::CAMELNAME,那就太好了,但不幸的是,这不起作用。