有一种方法可以将生成的类配置为使用 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
并因此将所有键作为 camelCase 返回。
问题的根源在于 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()
会将所有键作为 camelCase。
所以不幸的是你不能在toJSON
不修改源代码的情况下使用 camelCase。我认为该exportTo
方法应该使用,defaultKeyType
因此我们可以使用配置来修改此行为。话虽如此,使用硬编码值而不是可配置值可能是一个很好的理由。
更新:
看起来这只适用于每个生成的模型类的单个实例。对于ObjectCollection
andCollection
类,toArray
andexportTo
方法使用硬编码的值TableMap::TYPE_PHPNAME
推进/运行时/集合/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()));
}
推进/运行时/集合/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
但不幸的是,这不起作用。