我曾经花了一个多小时对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');我在文档的任何地方都找不到这个。
用xPDO编辑,您必须特别添加默认情况下未加载的包。默认情况下,xPDO在实例化时不加载任何包。
然而,我曾经花了相当长的时间来解构xPDO的构造函数,并发现有一个可选的参数,允许您定义一个包数组,这些包将在实例化时加载。
我的问题是我不记得该怎么做了。
发布于 2014-05-27 09:19:18
您可以加载基本包,将正确的选项传递给xPDO构造函数。这是构造函数的定义:
$xpdo= new xPDO($dsn, $username= '', $password= '', $options= array(), $driverOptions= null) 选项数组支持许多不同的配置,您要寻找的是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, ...")
);这里有一个指向文档的链接,在这里您可以找到有关options数组的更多细节:http://rtfm.modx.com/xpdo/2.x/getting-started/fundamentals/xpdo,-the-class/the-xpdo-constructor
编辑
字符串的格式如下:
"package_name:absolute_path;prefix“
前缀是可选的。我已经用这个格式字符串更新了上面的代码。
发布于 2014-05-25 08:43:49
虽然我不完全确定您要求的是什么,但我怀疑您是在问是否存在一些已知的方法来传递具有相同路径的包的包名数组。假设这是正确的,我有以下可能的解决方案(如果不是,请按照刮板的要求,澄清您要问的内容):
在查看了类xPDO & method addPackage()中的@文件addPackage()之后,我看到它专门验证包名是否是字符串&如果不是,则会产生错误。因此,addPackage()肯定不允许将数组传递给它。
但是,我怀疑您可能还记得,如果您在一个包/额外目录上使用addPackage(),该目录具有多个xPDO类&映射文件&模式.表示的所有数据库表都能够被实例化&用于执行CRUD操作。
例如,我有两个包(来自不同的附加程序),它们具有以下路径--核心/组件/packageName/(方括号中的内容将是特定包的实际名称)。此外,模型文件位于core/components/packageName/model/packageName/以及子目录/mysql中。在这两种情况下,当我添加包packageName时,所有类都可以实例化,因为我没有包含/需要任何文件,所以addPackage()似乎包含它们&因此,通过使用xPDO方法newQuery(),可以将它们作为xPDO对象使用。
(因此,在代码中:
$modx->newQuery(nameOfxPDOClassToBeInstantiated);)
(注意:我的两个包所需的所有类都是从自定义DB表中生成的,使用Bob 这里提供的非常方便的工具,并由他在一个简单的教程这里中解释)。
希望这能有所帮助。
事后来看,这是关于xPDO addPackage: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
https://stackoverflow.com/questions/21110198
复制相似问题