Php 在xPDO中加载基本包

Php 在xPDO中加载基本包,php,xpdo,Php,Xpdo,我曾经花了一个多小时对构造函数进行反向工程,以了解如何在实例化时加载基本包 不幸的是,我丢失了那一小段代码!我只剩下这个了 $this->database = new xPDO( "mysql:host=" . $this->config->item('hostname', XPDO) . ";dbname=" . $this->config->item('database', XPDO), $this->config->i

我曾经花了一个多小时对构造函数进行反向工程,以了解如何在实例化时加载基本包

不幸的是,我丢失了那一小段代码!我只剩下这个了

$this->database = new xPDO(
    "mysql:host=" . $this->config->item('hostname', XPDO) . 
    ";dbname="  . $this->config->item('database', XPDO), 
    $this->config->item('username', XPDO), 
    $this->config->item('password', XPDO), 
    $this->config->item('dbprefix', XPDO)
);

// This is line I would like to pass to the constructor.
$this->database->addPackage('packageName', $this->config->item('core_path') . "components/package/model/", '_packagePrefix');
我在世界上任何地方都找不到这个

编辑 使用xPDO,您必须专门添加默认情况下未加载的包。默认情况下,xPDO不会在实例化时加载任何包

然而,我确实花了相当多的时间来解构xPDO的构造函数,并发现有一个可选参数,允许您定义将在实例化时加载的包数组


我的问题是我记不起怎么做了。

虽然我不完全确定您要的是什么,但我怀疑您是在问是否有某种已知的方法可以为具有相同路径的包传递包名数组。 假设这是正确的,我有以下可能的解决方案(如果不是,请按照要求澄清您的问题):

在类xpdo&method addPackage()中查看了@xpdo.class.php文件后,我发现它专门验证了包名是否为字符串,如果不是,则会产生错误。 因此,此方法addPackage()肯定不允许向其传递数组

但是,我怀疑您可能还记得,如果您在包含多个xPDO类、映射文件和模式的package/extra目录上使用addPackage()。。。表示的所有数据库表都将能够实例化并用于在上执行CRUD操作

例如,我有两个包(来自单独的extras),它们具有以下路径core/components/[packageName]/(括号中的内容是特定包的实际名称)。 此外,模型文件位于core/components/[packageName]/model/[packageName]/以及子目录/mysql中。 在这两种情况下,当我添加包[packageName]时,所有类都可以被实例化,因为我没有包含/需要任何文件,所以addPackage()似乎包含它们&因此通过使用modx方法newQuery()使它们可用作xPDO对象

(因此,在代码中:

$modx->newQuery(nameOfxPDOClassToBeInstantiated);
)

(注意:我的两个包的所有必要类都是从自定义DB表生成的,使用Bob Ray提供的非常方便的工具,并由他在一个简单的教程中解释)

希望有帮助

作为补充,这里是关于addPackage的xPDO文档: 这是关于使用这些对象的文档。。。

您可以将正确的选项传递给xPDO构造函数来加载基本包。这是构造函数的定义:

$xpdo= new xPDO($dsn, $username= '', $password= '', $options= array(), $driverOptions= null) 
选项阵列支持多种不同的配置,您正在寻找的是xPDO::OPT_BASE_包

xPDO::OPT_BASE_PACKAGES-由逗号分隔的包字符串 实例化时要加载的名称/路径(用冒号分隔)

基本上,您可以通过以下方式修改代码:

$this->database = new xPDO(
    "mysql:host=" . $this->config->item('hostname', XPDO) . 
    ";dbname="  . $this->config->item('database', XPDO), 
    $this->config->item('username', XPDO), 
    $this->config->item('password', XPDO), 
    array(xPDO::OPT_BASE_PACKAGES => "package1:path1;prefix, package2:path2, ...")
);
以下是指向文档的链接,您可以在其中找到有关选项阵列的更多详细信息:

编辑

字符串的格式如下所示:

“包名称:绝对路径;前缀”


前缀是可选的。我已经用这个格式字符串更新了上面的代码。

你能把它作为一个问题来表达,并提供一点关于你想要什么的详细信息吗。我不确定字符串的格式。因为它被拆分以创建
addPackage
的参数。我将不得不再次查看构造函数。我认为这是一个类似于包名的东西;包裹路径;package_prefix'@IanBrindley我已经用正确的格式字符串更新了我的答案。顺便问一下@IanBrindley,你能把答案标记为已接受以备将来参考吗?或者如果它需要一些修改,告诉我我应该添加到它或作出任何你认为必要的编辑。谢谢