0

我正在用 Propel 做各种各样的事情,这可能有点边缘情况——特别是我发现与表名关联的类名被缓存在某处,并且由于我重建了一个具有不同类名但表名相同的模型(用于单元测试目的)推进是正确的泡菜。(对于这个问题,您不需要 Propel 经验;只需了解 PHP,尤其可能是魔术调用)

为了调试这个问题,我发现 Propel 在设置列值时会为表填充一个“tablemap”类。我的目的是找出这个填充发生在代码中的哪个位置,这样我就可以清除 Propel 中缓存的 tablemap(s)。

具体来说,TestOrganiser 类有一个生成的父 BaseTestOrganiser,它有一个列设置方法,因此:

// The ** lines are mine, the rest are auto-generated by propel.
// The output when setting a value and saving is "no yes " which
// shows that the '$this->modifiedColumns[]' line triggers the
// tablemap population
public function setName($v)
{
    if ($v !== null) {
        $v = (string) $v;
    }

    if ($this->name !== $v) {
        $this->name = $v;

        $map = Propel::getDatabaseMap('test'); // **
        echo $map->getTables() ? 'yes ' : 'no '; // **
        $this->modifiedColumns[] = TestOrganiserPeer::NAME;
        echo $map->getTables() ? 'yes ' : 'no '; // **
    }

    return $this;
} // setName()

根据评论, $map->getTables() 的值作为该$this->modifiedColumns[] = TestOrganiserPeer::NAME行的结果从空变为非空。但是,这个类或其子类或父类中没有 __set() 方法,所以我很困惑这里可以触发什么代码。

有任何想法吗?

4

1 回答 1

1

哦!这很明显,事后诸葛亮!

我在一行中添加了打印debug_backtrace()并找到了触发 tablemap 人口的代码。这最终表明TestOrganiserPeer触发 Propel 的自动加载器的使用,并且当加载对等类时,这反过来会导致立即调用BaseTestOrganiserPeer::buildTableMap().

于 2011-11-20T22:31:18.760 回答