我曾经花了一个多小时对xPDO构造函数进行逆向工程,以确定如何在实例化时加载基础包。
不幸的是,我丢失了一小段代码!我就离开了。
$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');
我无法在documentation中的任何地方找到它。
修改 使用xPDO,您必须专门添加默认情况下未加载的包。默认情况下,xPDO不会在实例化时加载任何包。
但是,我曾经花了相当多的时间,解构了xPDO的构造函数,发现有一个可选参数允许你定义一个将在实例化时加载的包数组。
我的问题是我不记得怎么做了。
答案 0 :(得分:1)
虽然我并不完全确定你要求的是什么我怀疑你是否在询问是否有一些已知的方法可以为具有相同路径的包传递包名称数组。 假设这是正确的,我有以下可能的解决方案(如果不是,请按scragar请求,澄清您的要求):
在xPDO&类中查看@文件xpdo.class.php方法addPackage()我看到它专门验证包名是一个字符串&如果不是,则会产生错误。 因此,此方法addPackage()当然不允许将数组传递给它。
但是,我怀疑你可能记得,如果你在一个包含多个xPDO类的包/额外目录上使用addPackage()&映射文件&一个模式......所表示的所有数据库表都能够被实例化。用于执行CRUD操作。
作为一个例子,我有两个包(来自单独的附加组件),它们具有以下路径core / components / [packageName] /(其中括号中的东西将是特定包的实际名称)。 此外,模型文件位于core / components / [packageName] / model / [packageName] /以及子目录/ mysql中。 在我添加包[packageName]的情况下,所有类都可以实例化,因为我没有包含/需要任何文件,所以addPackage()似乎包括它们&因此,通过使用modx方法newQuery()
使它们可用作xPDO对象(所以在代码中:
$modx->newQuery(nameOfxPDOClassToBeInstantiated);
)
(注意:我的两个软件包的所有必要类都是使用Bob Ray here提供的非常方便的工具从自定义数据库表生成的,并由他在简单的教程中here解释。
希望有所帮助。
作为事后的想法,这里是关于addPackage的xPDO文档: http://rtfm.modx.com/xpdo/2.x/class-reference/xpdo/xpdo.addpackage 这里有关于利用对象的文档...... http://rtfm.modx.com/xpdo/2.x/getting-started/using-your-xpdo-model/retrieving-objects
答案 1 :(得分:1)
您可以加载通过正确选项的基础包到xPDO构造函数。这是构造函数定义:
$xpdo= new xPDO($dsn, $username= '', $password= '', $options= array(), $driverOptions= null)
options数组支持许多不同的配置,你要找的是 xPDO :: OPT_BASE_PACKAGES :
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, ...")
);
这是指向文档的链接,您可以在其中找到有关选项数组的更多详细信息:http://rtfm.modx.com/xpdo/2.x/getting-started/fundamentals/xpdo,-the-class/the-xpdo-constructor
修改强>
字符串的格式如下:
"程序包:absolute_path;前缀"
前缀是可选的。我已使用此格式字符串更新了上面的代码。