你遇到了ModX的一个小故障,我花了很长时间才解决。ModX 通过使用散列进行大量缓存,显然,当在一个页面内建立多个连接时,该页面分为多个片段,可以看到这种不稳定的行为。这很可能是非常不受欢迎的行为,它可以很容易地解决,但会让你非常头疼。
一种症状是$modx->getObject($classname, $id)
返回 null(通常)。
解决方案非常简单:要么使用带有单个 db 实例的静态类,要么使用$modx->setPlaceholder($instance, $tag);
,或组合使用。
我的解决方案是:
class dt__xpdo {
private function __construct() {}
public function __destruct() {
$this->close();
}
static public function db($modx = null) {
if ($modx->getPlaceholder('dt_xpdo') == '') {
$dt_user = 'xxxxxxxxx';
$dt_pw = 'xxxxxxxxx';
$dt_host = 'localhost';
$dt_dbname = 'xxxxxxxxx';
$dt_port = '3306';
$dt_dsn = "mysql:host=$dt_host;dbname=$dt_dbname;port=$dt_port;charset=utf8";
$dt_xpdo = new xPDO($dt_dsn, $dt_user, $dt_pw);
$dt_xpdo->setPackage('mymodel', MODX_CORE_PATH.'components/mymodel/'.'model/', '');
//$modx->log(modX::LOG_LEVEL_DEBUG, 'mymodel.config.php');
//$modx->log(modX::LOG_LEVEL_DEBUG, 'Could not addPackage for mymodel!');
$modx->setPlaceholder('dt_xpdo', $dt_xpdo);
}
return $modx->getPlaceholder('dt_xpdo');
}
}
现在您可以在代码中使用:
require_once 'above.php';
并使用类似的东西
$xpdo = dt__xpdo::db($modx);
并继续完美无缺!